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

/*
 ONOS GUI -- Remote -- General Purpose Functions
 */
(function () {
    'use strict';

    var uiContext = '/onos/ui/',
        rsSuffix = uiContext + 'rs/',
        wsSuffix = uiContext + 'websock/';

    angular.module('onosRemote')
        .factory('UrlFnService', ['$location', function ($loc) {

            function matchSecure(protocol) {
                var p = $loc.protocol(),
                    secure = (p === 'https' || p === 'wss');
                return secure ? protocol + 's' : protocol;
            }

            function urlBase(protocol, port, host) {
                return matchSecure(protocol) + '://' +
                    (host || $loc.host()) + ':' + (port || $loc.port());
            }

            function httpPrefix(suffix) {
                return urlBase('http') + suffix;
            }

            function wsPrefix(suffix, wsport, host) {
                return urlBase('ws', wsport, host) + suffix;
            }

            function rsUrl(path) {
                return httpPrefix(rsSuffix) + path;
            }

            function wsUrl(path, wsport, host) {
                return wsPrefix(wsSuffix, wsport, host) + path;
            }

            return {
                rsUrl: rsUrl,
                wsUrl: wsUrl
            };
        }]);

}());
