/*
 * Copyright 2018-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 {ChangeDetectorRef, Component, OnDestroy, OnInit} from '@angular/core';
import {
    FnService,
    LogService, SortDir,
    TableBaseImpl,
    WebSocketService
} from 'gui2-fw-lib';
import {ActivatedRoute, Router} from '@angular/router';

const pipeconfReq = 'pipeconfRequest';
const pipeconfResp = 'pipeConfResponse';

export interface PipeconfHeader {
    id: string;
    behaviors: string[];
    extensions: string[];
}

export interface ActionParam {
    name: string;
    bitWidth: number;
}

export interface PipeconfAction {
    name: string;
    params: ActionParam[];
}

export interface MatchFields {
    matchType: string;
    bitWidth: number;
    field: string;
}

export interface PipeconfTable {
    name: string;
    maxSize: number;
    hasCounters: boolean;
    supportAging: boolean;
    matchFields: MatchFields[];
    actions: string[];
}

export interface PipelineModel {
    actions: PipeconfAction[];
    tables: PipeconfTable[];
}

export interface PipeconfData {
    pipeconf: PipeconfHeader;
    pipelineModel: PipelineModel;
}


export interface TableStat {
    table: string;
    active: number;
    haslookedup: boolean;
    lookedup: number;
    matched: number;
    hasmaxsize: boolean;
    maxsize: number;
}

export interface TableStats {
    tableStats: TableStat[];
}

/**
 * ONOS GUI -- Pipeconf View Component
 */
@Component({
    selector: 'onos-pipeconf',
    templateUrl: './pipeconf.component.html',
    styleUrls: ['./pipeconf.component.css', '../../../fw/widget/table.css', '../../../fw/widget/table.theme.css']
})
export class PipeconfComponent extends TableBaseImpl implements OnInit, OnDestroy {
    devId: string;
    pipeconfData: PipeconfData;
    selectedTable: PipeconfTable;
    parentSelCb = this.updateSelected; // Func

    // TODO: Update for LION
    flowTip = 'Show flow view for selected device';
    portTip = 'Show port view for selected device';
    groupTip = 'Show group view for selected device';
    meterTip = 'Show meter view for selected device';
    pipeconfTip = 'Show pipeconf view for selected device';
    na = 'N/A';

    constructor(
        protected fs: FnService,
        protected log: LogService,
        protected ar: ActivatedRoute,
        protected router: Router,
        protected wss: WebSocketService,
        private ref: ChangeDetectorRef,
    ) {
        super(fs, log, wss, 'tableStat', 'table');
        this.ar.queryParams.subscribe(params => {
            this.devId = params['devId'];

        });

        this.payloadParams = {
            devId: this.devId
        };

        this.responseCallback = this.tableStatsResponseCb;

        this.sortParams = {
            firstCol: 'table',
            firstDir: SortDir.desc,
            secondCol: 'active',
            secondDir: SortDir.asc,
        };
    }

    ngOnInit() {
        // Also make a once off call to get the Pipeconf Static information
        this.wss.bindHandlers(new Map<string, (data) => void>([
            [pipeconfResp, (data) => {
                this.pipeconfData = data;
                this.ref.markForCheck();
                this.log.debug('Pipeconf static data received', this.pipeconfData);
            }]
        ]));

        const p = Object.assign({}, this.sortParams, this.payloadParams);

        // Allow it to sit in pending events
        if (this.wss.isConnected()) {
            this.wss.sendEvent(pipeconfReq, p);
        }

        this.init();

        this.log.debug('PipeconfComponent initialized');
    }

    ngOnDestroy() {
        this.destroy();
        this.wss.unbindHandlers([pipeconfResp]);

        this.log.debug('PipeconfComponent destroyed');
    }

    tableStatsResponseCb(newTableData: TableStats) {
        // checks if data changed for row flashing
    }

    /**
     * There's nothing to navigate down further to for Pipeconf - instead we can
     * navigate for the Device that was passed in
     * @param path
     */
    navto(path) {
        this.log.debug('navigate to', path);
        this.router.navigate([path], { queryParams: { devId: this.devId } });
    }

    pipeconfModelTable(table: string): PipeconfTable {
        if (this.pipeconfData === undefined) {
            return; // Not loaded yet
        }
        for (const t of this.pipeconfData.pipelineModel.tables) {
            if (t.name === table) {
                return t;
            }
        }
        this.log.warn('Could not find table', table, 'in PipelineModel');
    }

    updateSelected(event: any, selRow: any): void {
        if (this.selId === undefined) {
            this.selectedTable = undefined;
        } else {
            this.selectedTable = this.pipeconfModelTable(this.selId);
        }
    }
}
