/*
 * Copyright 2020-present Open Networking Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import {Component, OnInit, OnDestroy} from '@angular/core';
import { FormBuilder, FormGroup, FormArray, FormControl, Validators } from '@angular/forms';

import {
    FnService,
    LogService,
    WebSocketService,
    SortDir, TableBaseImpl, TableResponse,
} from 'gui2-fw-lib';

import {ActivatedRoute, Router} from '@angular/router';

// constants
const intIntentAddReq = 'intIntentAddRequest';
const intIntentDelReq = 'intIntentDelRequest';
const regSendIp = '^([0-9]{1,3}\\.){3}[0-9]{1,3}(\\/[0-9]{1,2})?$'
const regSendPort ='^[0-9]{0,5}$'

export interface Metadata {
    name: string;
    value: string;
}

/**
 * ONOS GUI -- INT App View Component
 */
@Component({
    selector: 'int-app',
    templateUrl: './intapp.component.html',
    styleUrls: ['./intapp.component.css',
        '../../../fw/widget/table.css',
        '../../../fw/widget/table.theme.css'
    ]
})
export class IntAppComponent extends TableBaseImpl implements OnInit, OnDestroy {

    formConf: FormGroup;
    formSend: FormGroup;
    metaData: Metadata[] = [
        { name: 'Switch ID', value : 'SWITCH_ID'},
        { name: 'Port IDs', value:'PORT_ID' },
        { name: 'Hop Latency', value: 'HOP_LATENCY', },
        { name: 'Queue Occupancy', value:'QUEUE_OCCUPANCY' },
        { name: 'Ingress Timestamp', value:'INGRESS_TIMESTAMP' },
        { name: 'Egress Timestamp', value: 'EGRESS_TIMESTAMP' },
        { name: 'Egress Port Tx Utilization', value:'EGRESS_TX_UTIL' },
    ];

    constructor(
        protected fs: FnService,
        protected log: LogService,
        protected as: ActivatedRoute,
        protected router: Router,
        protected wss: WebSocketService,
        protected fb: FormBuilder,
    ) {
        super(fs, log, wss, 'intAppIntIntent');

    }

    ngOnInit() {
        this.init();
        this.formSend = this.fb.group({
            name: this.fb.array([]),
            ip4SrcPrefix: new FormControl(null, [Validators.required, Validators.pattern(regSendIp)]),
            ip4DstPrefix: new FormControl(null, [Validators.required, Validators.pattern(regSendIp)]),
            l4SrcPort: new FormControl(null, [ Validators.pattern(regSendPort)]),
            l4DstPort: new FormControl(null, [ Validators.pattern(regSendPort)]),
            protocol: new FormControl(),
            telemetryMode: new FormControl("POSTCARD")
        });
        this.log.debug('IntAppComponent initialized');
    }

    ngOnDestroy() {
        this.destroy();
        this.log.debug('IntAppComponent destroyed');
    }

    navto(path) {
        this.log.debug('navigate');
        if (this.selId) {
            this.router.navigate([path], {queryParams: {itemId: this.selId}});
        }
    }

    onCheckboxChange(name: string, isChecked: boolean) {
        this.log.debug('event'+ isChecked);
        const meta = (this.formSend.controls.name as FormArray);

        if (isChecked) {
            meta.push(new FormControl(name));
        } else {
            const index = meta.controls.findIndex(x => x.value === name);
            meta.removeAt(index);
        }
    }

    sendIntIntentString() {
        if (this.formSend.invalid) {
            return;
        }
        let intentObjectNode = {
            "ip4SrcPrefix": this.formSend.value.ip4SrcPrefix,
            "ip4DstPrefix": this.formSend.value.ip4DstPrefix,
            "l4SrcPort": this.formSend.value.l4SrcPort,
            "l4DstPort": this.formSend.value.l4DstPort,
            "protocol": this.formSend.value.protocol,
            "metadata": this.formSend.value.name,
            "telemetryMode": this.formSend.value.telemetryMode
        };
        this.wss.sendEvent(intIntentAddReq, intentObjectNode);
    }

    delIntIntent(){
        if (this.selId) {
            this.wss.sendEvent(intIntentDelReq,{"intentId": this.selId});
        }
    }
}
