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

(function () {
    'use strict';

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

    // configuration
    var allTrafficTypes = [
            'flowStatsBytes',
            'portStatsBitSec',
            'portStatsPktSec'
        ],
        allTrafficMsgs = [
            'Flow Stats (bytes)',
            'Port Stats (bits / second)',
            'Port Stats (packets / second)'
        ];

    // internal state
    var mode = null,
        allIndex = 0;

    // === -----------------------------------------------------

    function cancelTraffic() {
        $log.debug('Topo2Traffic: Cancel Traffic');

        if (!mode) {
            return false;
        }
        mode = null;
        wss.sendEvent('topo2CancelTraffic');
        flash.flash('Traffic monitoring canceled');
        return true;
    }

    function showAllTraffic() {
        $log.debug('Topo2Traffic: Show All Traffic');

        mode = 'allFlowPort';
        wss.sendEvent('topo2RequestAllTraffic', {
            trafficType: allTrafficTypes[allIndex]
        });
        flash.flash(allTrafficMsgs[allIndex]);
        allIndex = (allIndex + 1) % 3;
    }

    // === -----------------------------------------------------

    angular.module('ovTopo2')
        .factory('Topo2TrafficService', [
            '$log', 'FnService', 'FlashService', 'WebSocketService',

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

                return {
                    initTraffic: function (_api_) { api = _api_; },
                    destroyTraffic: function () {},

                    // invoked from toolbar overlay buttons or keystrokes
                    cancelTraffic: cancelTraffic,
                    showAllTraffic: showAllTraffic
                }
            }
        ]);
}());