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

/*
 sfc web gui overlay implementation.
 */

(function () {
    'use strict';

    // injected refs
    var $log, fs, flash, wss, tds, ds, handlerMap = {};

    // constants
    var displayStart     = 'sfcwebTopovDisplayStart',
        showSfcInf       = 'showSfcInfo',
        clearMessage     = 'sfcTopovClear',
        configSfpMessage = 'configSfpMessage',
        sfcPath          = 'showSfcPath' ;

    // internal state
    var currentMode = null;
    var sfpInfo;

    // === Main API functions

    function start() {
        handlerMap[showSfcInf] = showSfcInformation;
        handlerMap[sfcPath] = showSfcPath;
        wss.bindHandlers(handlerMap);
        wss.sendEvent(displayStart);
    }

    function dOkSfp() {
        var tdString;
        var i = 0;

        sfpInfo.a.forEach( function () {
            var sfpId = d3.select("#sfp-value-id-"+i).property("checked");
            if (sfpId)
            {
                tdString = sfpInfo.a[i];
            }
            i++;
        } );

        if (!tdString) {
            $log.debug("No SFP ID is selected.");
        }

       wss.sendEvent(configSfpMessage, {
            id: tdString
        });

        flash.flash('SFP ID query:');
    }

    function dClose() {
        $log.debug('Dialog Close button clicked (or Esc pressed)');
    }

    function createUserTextSfp(data) {
        console.log(data);

        var content = ds.createDiv();
        var form = content.append('form');
        var p = form.append('p');
        var i = 0;

        p.append('span').text('SFP IDs');
        p.append('br');
        sfpInfo = data;
        data.a.forEach( function () {

            p.append('input').attr({
                id: 'sfp-value-id-'+i,
                type: 'radio',
                name: 'sfp-id-name',
                value: data.a[i]
            });

            p.append('span').text(data.a[i]);
            p.append('br');
            i++;
        } );

        return content;
    }

    function showSfcInformation(data) {
        tds.openDialog()
            .setTitle('List of active service functions')
            .addContent(createUserTextSfp(data))
            .addOk(dOkSfp, 'Select SFP ID')
            .addCancel(dClose, 'Close')
            .bindKeys();

    }

    function createSfcPathText(data) {

        var content = ds.createDiv();
        var form = content.append('form');
        var p = form.append('p');
        var i = 0;

        p.append('span').text('SFC Path');
        p.append('br');
        data.sfcPathList.forEach( function (val, idx) {
            p.append('span').text(val);
            p.append('br')
        } );

        return content;
    }

    function showSfcPath(data) {
        tds.openDialog()
            .setTitle('Service function path')
            .addContent(createSfcPathText(data))
            .addCancel(dClose, 'Close')
            .bindKeys();
    }

    function clear() {
        wss.sendEvent(clearMessage);
        flash.flash('Cleared SFC overlay');
    }

    // === ---------------------------
    // === Module Factory Definition
    angular.module('ovSfcwebTopov', [])
        .factory('SfcwebTopovDemoService',
        ['$log', 'FnService', 'FlashService', 'WebSocketService', 'TopoDialogService', 'DialogService',
        function (_$log_, _fs_, _flash_, _wss_, _tds_, _ds_) {
            $log = _$log_;
            fs = _fs_;
            flash = _flash_;
            wss = _wss_;
            tds = _tds_;
            ds = _ds_;
            return {
                start: start,
                showSfcInformation: showSfcInformation,
                showSfcPath : showSfcPath,
                clear: clear
            };
        }]);

}());
