/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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.
 */

/*
 Sample Demo module. This contains the "business logic" for the topology
 overlay that we are implementing.
 */

(function () {
    'use strict';

    // injected refs
    var $log, fs, flash, wss;

    // constants
    var srcMessage = 'ppTopovSetSrc',
        dstMessage = 'ppTopovSetDst',
        swapMessage = 'ppTopovSwapSrcDst',
        modeMessage = 'ppTopovSetMode',
        nextPathMessage = 'ppTopovNextPath',
        clearMessage = 'ppTopovClear',
        prevPathMessage = 'ppTopovPrevPath';

    // internal state
    var currentMode = null;


    // === ---------------------------
    // === Helper functions


    // === ---------------------------
    // === Main API functions

    function clear() {
        wss.sendEvent(clearMessage);
        flash.flash('Source node: ' + node.id);
    }

    function setSrc(node) {
        wss.sendEvent(srcMessage, {
            id: node.id,
            type: node.type
        });
        flash.flash('Source node: ' + node.id);
    }

    function setDst(node) {
        wss.sendEvent(dstMessage, {
            id: node.id,
            type: node.type
        });
        flash.flash('Destination node: ' + node.id);
    }

    function swapSrcDst() {
        wss.sendEvent(swapMessage)
        flash.flash('Source and destination swap');
    }

    function nextPath() {
        wss.sendEvent(nextPathMessage);
    }

    function prevPath() {
        wss.sendEvent(prevPathMessage);
    }


    function setMode(mode) {
        if (currentMode === mode) {
            $log.debug('(in mode', mode, 'already)');
            flash.flash('Already in ' + mode + ' mode');
        } else {
            currentMode = mode;
            wss.sendEvent(modeMessage, {
                mode: mode
            });
            flash.flash('Path mode: ' + mode);
        }
    }

    // === ---------------------------
    // === Module Factory Definition

    angular.module('ovPpTopov', [])
        .factory('PathPainterTopovService',
        ['$log', 'FnService', 'FlashService', 'WebSocketService',

        function (_$log_, _fs_, _flash_, _wss_) {
            $log = _$log_;
            fs = _fs_;
            flash = _flash_;
            wss = _wss_;

            return {
                setSrc: setSrc,
                setDst: setDst,
                setMode: setMode,
                nextPath: nextPath,
                prevPath: prevPath,
                swapSrcDst: swapSrcDst,
                clear: clear
            };
        }]);
}());
