/*
 * 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.
 */

/*
 ONOS GUI -- Openstack Vtap View Module
 */
(function () {
    'use strict';

    // injected refs
    var $log, tov, ovts, fs, wss, tts, api, gs, ps, ds;

    // constants
    var pCls = 'topo-p',
        idVta = 'topo-p-vtap',
        idVDi = 'vtap-dialog',
        vtapPanelOpts = {
            edge: 'left',
            width: 330, // vtap panel width
        }

    // panels
    var vtap;

    // selected info
    var selectedItem;

    // constants
    var osvIsActReq = 'openstackVtapIsActivatedRequest',
        osvIsActResp =  'openstackVtapIsActivatedResponse',
        osvCreateReq = 'openstackVtapCreateRequest',
        osvCreateResp = 'openstackVtapCreateResponse';

    // function to be replaced by the localization bundle function
    var topoLion = function (x) {
        return '#ttrafov#' + x + '#';
    };

    var overlay = {
        overlayId: 'vtap-overlay',
        glyphId: 'm_details',
        tooltip: 'Openstack Vtap Overlay',

        activate: function () {
            $log.debug("Openstack Vtap topology overlay ACTIVATED");
        },
        deactivate: function () {
            destroyVtapPanel();
            $log.debug("Openstack Vtap topology overlay DEACTIVATED");
        },

        // detail panel button definitions
        buttons: {
            createHostVtapBtn: {
                gid: 'm_details',
                tt: 'Create Host-to-Host Vtap',
                cb: displayVtap
            },
            showRelatedTraffic: {
                gid: 'm_relatedIntents',
                tt: function () { return topoLion('tr_btn_show_related_traffic'); },
                cb: function (data) { tts.showRelatedIntents(); },
            },
        },

        hooks: {
            multi: function (selectOrder) {
                var selectedHost = new Object();
                for (var index in selectOrder) {
                    if (index == 0) {
                        selectedHost.src = selectOrder[index];
                    } else if (index == 1) {
                        selectedHost.dst = selectOrder[index];
                    }
                }

                selectedItem = selectedHost;

                tov.addDetailButton('showRelatedTraffic');
                if(selectOrder.length == 2) {
                    tov.addDetailButton('createHostVtapBtn');
                }
            }
        }
    };

    // Panel API
    function createTopoPanel(id, opts) {
        var p = ps.createPanel(id, opts),
            pid = id,
            header, body, footer;
        p.classed(pCls, true);

        function panel() {
            return p;
        }

        function hAppend(x) {
            return header.append(x);
        }

        function bAppend(x) {
            return body.append(x);
        }

        function fAppend(x) {
            return footer.append(x);
        }

        function setup() {
            p.empty();

            p.append('div').classed('header', true);
            p.append('div').classed('body', true);
            p.append('div').classed('footer', true);

            header = p.el().select('.header');
            body = p.el().select('.body');
            footer = p.el().select('.footer');
        }

        function destroy() {
            ps.destroyPanel(pid);
        }

        return {
            panel: panel,
            setup: setup,
            destroy: destroy,
            appendHeader: hAppend,
            appendBody: bAppend,
            appendFooter: fAppend,
        };
    }

    function hideVtapPanel() {
        vtap.panel().hide();
    }

    function destroyVtapPanel() {
        if(vtap != null) {
            vtap.destroy();
        }
        vtap = null;
    }

    function addInput(tbody, type, id, label, value) {
        var tr = tbody.append('tr'),
            lab;
        if (typeof label === 'string') {
            lab = label.replace(/_/g, ' ');
        } else {
            lab = label;
        }

        tr.append('td').attr('class', 'label').text(lab + ' :');

        if (type == 'radio') {
            var td = tr.append('td');
            for(var index in value) {
                if(index == 0) {
                    td.append('input').classed( type + '-input', true)
                                          .attr('type', type)
                                          .attr('value', value[index])
                                          .attr('name', label)
                                          .attr('id', id)
                                          .attr('checked', 'true');
                } else {
                    td.append('input').classed( type + '-input', true)
                                          .attr('type', type)
                                          .attr('name', label)
                                          .attr('id', id)
                                          .attr('value', value[index]);
                }
                td.append('span').text(value[index]);
            }
        } else {
            tr.append('td').append('input').classed(type + '-input', true).attr('type', type)
                .attr('id', id).attr('value', value);
        }
    }

    function addButton(tr, callback, value) {
        tr.append('td').append('input').classed('button-input', true).attr('type', 'button')
                        .attr('value', value).on('click', callback);
    }

    function makeButton(callback, text, keyName) {
        var cb = fs.isF(callback),
            key = fs.isS(keyName);

        function invoke() {
            cb && cb();
        }

        return createDiv('vtap-button')
            .text(text)
            .on('click', invoke);
    }

    function createDiv(cls) {
        var div = d3.select(document.createElement('div'));
        if (cls) {
            div.classed(cls, true);
        }
        return div;
    }

    function addInput(tbody, type, id, label, value) {
        var tr = tbody.append('tr'),
            lab;
        if (typeof label === 'string') {
            lab = label.replace(/_/g, ' ');
        } else {
            lab = label;
        }

        tr.append('td').attr('class', 'label').text(lab + ' :');

        if (type == 'radio') {
            var td = tr.append('td');
            for(var index in value) {
                if(index == 0) {
                    td.append('input').classed( type + '-input', true)
                                          .attr('type', type)
                                          .attr('value', value[index])
                                          .attr('name', label)
                                          .attr('id', id)
                                          .attr('checked', 'true');
                } else {
                    td.append('input').classed( type + '-input', true)
                                          .attr('type', type)
                                          .attr('name', label)
                                          .attr('id', id)
                                          .attr('value', value[index]);
                }
                td.append('span').text(value[index]);
            }
        } else {
            tr.append('td').append('input').classed(type + '-input', true).attr('type', type)
                .attr('id', id).attr('value', value);
        }
    }

    function addButton(tr, callback, value) {
        tr.append('td').append('input').classed('button-input', true).attr('type', 'button')
                        .attr('value', value).on('click', callback);
    }

    function makeButton(callback, text, keyName) {
        var cb = fs.isF(callback),
            key = fs.isS(keyName);

        function invoke() {
            cb && cb();
        }

        return createDiv('vtap-button')
            .text(text)
            .on('click', invoke);
    }

    function createDiv(cls) {
        var div = d3.select(document.createElement('div'));
        if (cls) {
            div.classed(cls, true);
        }
        return div;
    }

    function displayVtap() {
        $log.debug("sendEvent openstackVtapIsActivatedRequest: ", selectedItem);
        wss.sendEvent(osvIsActReq, selectedItem);
    }

    function respIsActCb(selected) {
        $log.debug("openstackVtapIsActivatedResponse: ", selected);
        if(vtap == null) {
            vtap = createTopoPanel(idVta, vtapPanelOpts);
        }
        vtap.setup();

        var svg = vtap.appendHeader('div')
                     .classed('icon', true)
                     .append('svg'),
            title = vtap.appendHeader('h2'),
            table = vtap.appendBody('table'),
            tbody = table.append('tbody'),
            glyphId = 'm_details';

        gs.addGlyph(svg, glyphId, 30, 0, [1, 1]);

        title.text('Create OpenstackVtap');

        addInput(tbody, 'text', 'srcIp', 'Source IP', selected.srcName);
        addInput(tbody, 'text', 'dstIp', 'Destination IP', selected.dstName);
        addInput(tbody, 'radio', 'ipProto', 'Protocol', selected.ipProtoList);
        addInput(tbody, 'number', 'srcPort', 'Source Port', "");
        addInput(tbody, 'number', 'dstPort', 'Destination Port', "");
        addInput(tbody, 'radio', 'vtapType', 'Type', selected.vtapTypeList);

        vtap.appendFooter('hr');
        var footTr = vtap.appendFooter('table').append('tbody').append('tr');

        addButton(footTr, createVtap, 'Create');
        addButton(footTr, hideVtapPanel, 'Cancel');

        vtap.panel().show();
    }

    function createVtap() {
        var vtapInfo = {};

        vtapInfo.srcIp = document.getElementById('srcIp').value;
        vtapInfo.dstIp = document.getElementById('dstIp').value;
        vtapInfo.ipProto = document.querySelector('input[name="Protocol"]:checked').value;
        vtapInfo.srcPort = document.getElementById('srcPort').value;
        vtapInfo.dstPort = document.getElementById('dstPort').value;
        vtapInfo.vtapType = document.querySelector('input[name="Type"]:checked').value;

        if(vtapInfo.srcPort == ""){
            vtapInfo.srcPort = 0;
        }
        if(vtapInfo.dstPort == ""){
            vtapInfo.dstPort = 0;
        }

        $log.debug("sendEvent openstackVtapCreateRequest: ", vtapInfo);
        wss.sendEvent(osvCreateReq, vtapInfo);
        hideVtapPanel();

    }

    function respCreateCb(result) {
        $log.debug("respCreateCb: ", result);

        function dOK() {
            if(result.result == "Failed"){
                displayVtap(selectedItem);
            } else {
                destroyVtapPanel();
            }
        }

        function createContent(value) {
            var content = ds.createDiv();
            content.append('p').text(value);
            return content;
        }

        ds.openDialog(idVDi, vtapPanelOpts)
            .setTitle("Create Vtap " + result.result)
            .addContent(createContent(result.value))
            .addOk(dOK);
    }

    // invoke code to register with the overlay service
    angular.module('ovOpenstackvtap', [])
        .factory('OpenstackVtapTopovService',
        ['$log', 'FnService', 'WebSocketService', 'GlyphService', 'PanelService', 'DialogService',

        function (_$log_, _fs_, _wss_, _gs_, _ps_, _ds_) {
            $log = _$log_;
            fs = _fs_;
            wss = _wss_;
            gs = _gs_;
            ps = _ps_;
            ds = _ds_;

            var handlers = {},
                vtapOverlay = 'vtap-overlay',
                defaultOverlay = 'traffic';

            handlers[osvIsActResp] = respIsActCb;
            handlers[osvCreateResp] = respCreateCb;

            wss.bindHandlers(handlers);

            return {
                displayVtap: displayVtap
            };
        }])
        .run(['$log', 'TopoOverlayService', 'OpenstackVtapTopovService', 'TopoTrafficService',

            function (_$log_, _tov_, _ovts_, _tts_) {
                $log = _$log_;
                tov = _tov_;
                ovts = _ovts_;
                tts = _tts_;
                tov.register(overlay);
            }]
        );
}());
