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

/*
 ONOS GUI -- Topology Protected Intents Module.
 Defines behavior for viewing protected intents .
 */

(function () {
    'use strict';

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

    // internal state
    var showingProtectedIntent = null;

    // === -------------------------------------------------------------
    //  protected intent requests invoked from keystrokes or toolbar buttons...

    function cancelHighlights() {
        if (!showingProtectedIntent) {
            return false;
        }

        showingProtectedIntent = false;
        wss.sendEvent('cancelProtectedIntentHighlight');
        flash.flash('Monitoring canceled');
        return true;
    }

    // force the system to create a single intent selection
    function showProtectedIntent(data) {
        wss.sendEvent('selectProtectedIntent', data);
        flash.flash('Selecting Intent ' + data.key);
        showingProtectedIntent = true;
    }

    // === -----------------------------------------------------
    // === MODULE DEFINITION ===

    angular.module('ovTopo')
    .factory('TopoProtectedIntentsService',
        ['$log', 'FnService', 'FlashService', 'WebSocketService',

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

            return {
                initProtectedIntents: function (_api_) { api = _api_; },
                destroyProtectedIntents: function () { },

                // invoked from toolbar overlay buttons or keystrokes
                cancelHighlights: cancelHighlights,
                showProtectedIntent: showProtectedIntent
            };
        }]);
}());
