#!/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
            ;;

        *)
            arg="$1"; shift
            search+=("$arg")
            declare -g -i argv_search=1
            ;;
    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]
