#!/bin/bash
## -----------------------------------------------------------------------
## Intent: Construct gerrit server queries and URLs based on arguments
## -----------------------------------------------------------------------

{ # loader
    declare pgm=''
    pgm="$(realpath --canonicalize-existing "$0")"
    readonly pgm

    declare libdir="${pgm%/*}"
    libdir="${libdir%/*}/jenkins"
    readonly libdir

    declare root=''
    root="${pgm%%/jenkins/bin/jenkins.sh}"
    source "$root/lf/onf-common/common.sh" '--common-args-begin--'
}

##-------------------##
##---]  GLOBALS  [---##
##-------------------##
declare -x -g BROWSER="${BROWSER:-/usr/local/bin/firefox}"

declare -a comps=()
declare -a search=()
declare -a servs=()

##--------------------##
##---]  INCLUDES  [---##
##--------------------##

function usage()
{
    cat <<EOH
Usage: $0
  --computer        View jenkins node UI
  --serv(er) {cord}

EOH
}

##----------------##
##---]  MAIN  [---##
##----------------##
[[ $# -eq 0 ]] && { set -- '--help'; }

declare -a urls=()
while [ $# -ne 0 ]; do
    arg="$1"; shift
    case "$arg" in
        --help) usage; exit 0 ;;

        ## Modes
        --debug)
            # shellcheck disable=SC2034
            declare -g -i argv_debug=1
            declare -g -i debug=1
            ;;

        --comp*)
            arg="$1"; shift
            comps+=("$arg")

            declare -g -i argv_comp=1
            ;;

        --set*) set -x ;;
        --serv*)
            arg="$1"; shift
            case "$arg" in
                *cord*) servs+=('jenkins.opencord.org') ;;
                *) error "Detected invalid server name [$arg]" ;;
            esac
            ;;

        -*)
            shopt -s extglob # ON
            arg="${arg##+(-)}" # remove switch prefix
            shopt -u extglob # OFF
            search+=("$arg")
            declare -g -i argv_search=1
            ;;

        *) error "Detected invalid argument [$arg]" ;;
    esac
done

[[ ${#urls[@]} -eq 0 ]] && { servs+=('jenkins.opencord.org'); }

if [[ -v argv_comp ]]; then
    urls+=("https://${serv}/computer") 
    for serv in "${servs[@]}";
    do
        for comp in "${comps[@]}";
        do
            urls+=("https://${serv}/computer/$comp")
        done
    done
fi

if [[ -v argv_search ]]; then
    base='https://jenkins.opencord.org/view/bbsim/search'
    for search in "${search[@]}";
    do
        urls+=("${base}?q=${search}")
    done
    # https://jenkins.opencord.org/view/bbsim/search/?q=bbs&Jenkins-Crumb=2368d5a9f8f7999b720d0bf0dc605ef2230dce1a77baad6ab1dd1d8b2f4799ea
fi

if [[ ! -v argv_comp ]] && [[ ! -v argv_search ]]; then
    urls+=("https://jenkins.opencord.org")
fi

[[ ${#urls[@]} -gt 0 ]] && { "$BROWSER" "${urls[@]}" & }

# [EOF]
