/*
 * Copyright 2018-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.
 */
import { Injectable, Inject } from '@angular/core';
import { LogService } from '../log.service';

const UICONTEXT = '/onos/ui2/';
const RSSUFFIX = UICONTEXT + 'rs/';
const WSSUFFIX = UICONTEXT + 'websock/';

/**
 * ONOS GUI -- Remote -- General Purpose URL Functions
 */
@Injectable({
  providedIn: 'root',
})
export class UrlFnService {
    constructor(
        private log: LogService,
        @Inject('Window') private w: any
    ) {
        this.log.debug('UrlFnService constructed');
    }

    matchSecure(protocol: string): string {
        const p: string = this.w.location.protocol;
        const secure: boolean = (p === 'https' || p === 'wss');
        return secure ? protocol + 's' : protocol;
    }

    /* A little bit of funky here. It is possible that ONOS sits
     * behind a proxy and has an app prefix, e.g.
     *      http://host:port/my/app/onos/ui...
     * This bit of regex grabs everything after the host:port and
     * before the UICONTEXT (/onos/ui/) and uses that as an app
     * prefix by inserting it back into the WS URL.
     * If no prefix, then no insert.
     */
    urlBase(protocol: string, port: string = '', host: string = ''): string {
        const match = this.w.location.href.match('.*//[^/]+/(.+)' + UICONTEXT);
        const appPrefix = match ? '/' + match[1] : '';

        return this.matchSecure(protocol) +
            '://' +
            (host === '' ? this.w.location.hostname : host) +
            ':' +
            (port === '' ? this.w.location.port : port) +
            appPrefix;
    }

    httpPrefix(suffix: string): string {
        return this.urlBase('http') + suffix;
    }

    wsPrefix(suffix: string, wsport: string, host: string): string {
        return this.urlBase('ws', wsport, host) + suffix;
    }

    rsUrl(path: string): string {
        return this.httpPrefix(RSSUFFIX) + path;
    }

    wsUrl(path: string, wsport?: string, host?: string): string {
        return this.wsPrefix(WSSUFFIX, wsport, host) + path;
    }
}
