#!/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%/*}/gerrit"
    readonly libdir

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

##-------------------##
##---]  GLOBALS  [---##
##-------------------##
declare -g serv='gerrit.opencord.org'
declare -x -g BROWSER="${BROWSER:-/usr/local/bin/firefox}"
declare -g -a me=()

##--------------------##
##---]  INCLUDES  [---##
##--------------------##
source "${libdir}/filters/include.sh"
source "${libdir}/usage/include.sh"

## --------------------------------------------------------------------
## --------------------------------------------------------------------
function error()
{
    cat <<ERROR

** -----------------------------------------------------------------------
**   IAM: ${FUNCNAME[1]}
** ERROR: $@
** -----------------------------------------------------------------------
ERROR
    echo 
    exit 1
}

## -----------------------------------------------------------------------
## -----------------------------------------------------------------------
# function join_by_orig()
function join_by()
{
    local d=${1-} f=${2-}; if shift 2; then printf %s "$f" "${@/#/$d}"; fi;
}

## -----------------------------------------------------------------------
## Usage: $0 --repo voltha-go --search --wip
## -----------------------------------------------------------------------
function do_gerrit_search()
{
    local -n ref_urls=$1   ; shift
    local -n ref_repos=$1   ; shift
    local -n ref_status=$1 ; shift

    ref_urls=()

    # local stem='https://gerrit.opencord.org/q/project:voltha-go+status:open'
    local stem='https://gerrit.opencord.org/q/'

    local -a common=()
    [[ -v me ]] && { common+=("${me[@]}"); }
    common+=("${ref_status[@]}")

    local repo
    for repo in "${ref_repos[@]}";
    do
        local -a args=()
        args+=("project:${repo}")
        args+=("${common[@]}")

        local url="$stem"
        url+="$(join_by '+' "${args[@]}")"
        ref_urls+=("$url")
    done

    if [[ ${#ref_urls[@]} -eq 0 ]]; then
        local -a args=()
        args=("${common[@]}")

        local url="$stem"
        url+="$(join_by '+' "${args[@]}")"
        ref_urls+=("$url")
    fi

	# --debug)  declare -g -i debug=1 ;;
    # --search) declare -g -i search=1 ;;
    # --wip)    declare -g -i status_is_open=1 ;;

    return
}

## -----------------------------------------------------------------------
## Usage: $0 --status open --reviewer [u]
## -----------------------------------------------------------------------
function do_gerrit_review()
{
    local -n ref_urls=$1   ; shift
    local -n ref_repos=$1   ; shift
    local -n ref_status=$1 ; shift

    ref_urls=()

    # local stem='https://gerrit.opencord.org/q/project:voltha-go+status:open'
    local stem='https://gerrit.opencord.org/q/'

    local -a common=()
    [[ -v me ]] && { common+=('reviewer:self') }

    for reviewer in "${argv_reviewer[@]}"; do
        common+=("reviewer:${reviewer}")
    done

    local repo
    for repo in "${ref_repos[@]}";
    do
        local -a args=()
        args+=("project:${repo}")
        args+=("${common[@]}")

        local url="$stem"
        url+="$(join_by '+' "${args[@]}")"
        ref_urls+=("$url")
    done

    ## If not repo specific then query all
    if [[ ${#ref_urls[@]} -eq 0 ]]; then
        local -a args=()
        args=("${common[@]}")

        local url="$stem"
        url+="$(join_by '+' "${args[@]}")"
        ref_urls+=("$url")
    fi

	# --debug)  declare -g -i debug=1 ;;
    # --search) declare -g -i search=1 ;;
    # --wip)    declare -g -i status_is_open=1 ;;

    return
}
 
## -----------------------------------------------------------------------
## Intent: Iterate over --admin values and generate repositories
## -----------------------------------------------------------------------
function gen_admin_urls()
{
    local -n ref=$1     ; shift
    local -n _repos=$1  ; shift
    local -n _admins=$1 ; shift

    local repo
    for repo in "${_repos[@]}";
    do
        local attr
        for admin in "${_admins[@]}";
        do
            # https://gerrit.opencord.org/admin/repos/voltha-go
            case "$admin" in
                branches)
                    ref+=("https://gerrit.opencord.org/admin/repos/${repo},branches")
                    ;;
                tags)
                    ref+=("https://gerrit.opencord.org/admin/repos/${repo},tags")
                    ;;
                *) error "Unknown --admin type [$admin]" ;;
            esac

        done # admins[@]
    done # repos[@]
    return
}

## -----------------------------------------------------------------------
## Intent: Iterate over --admin values and generate repositories
## -----------------------------------------------------------------------
function gen_view_urls()
{
    local -n ref=$1    ; shift
    local -n _repos=$1 ; shift
    local -n _views=$1 ; shift

    local -a view_keys=("${!_views[@]}")
    local stem0="https://gerrit.opencord.org/plugins/gitiles"

    # https://gerrit.opencord.org/plugins/gitiles/ofagent-go

    local repo
    for repo in "${_repos[@]}";
    do
        local stem="${stem0}/$repo"
        local view
        for view in "${view_keys[@]}";
        do
            # https://gerrit.opencord.org/admin/repos/voltha-go
            case "$view" in
                # https://gerrit.opencord.org/plugins/gitiles/voltha-system-tests
                search) continue ;;
                default) ref+=("$stem")                      ;;
                # repo*) ref+=("$stem/$repo")                ;;
                  repo*) ref+=("$stem")                      ;;
                  master)
                      ref+=("$stem/+/refs/heads/master")
                      ;;

                  voltha-*)
                      echo "STEM: $stem"
                      if false; then
                          ref+=("$stem/+/refs/tags/${view}")
                          ref+=("$stem/+/refs/heads/${view}")
                      fi
                      # ref+=("$stem/+/refs/heads/${view}")
                      ref+=("$stem/+/refs/heads/${view}")
                    ;;

                    v*)  ref+=("$stem/+/refs/tags/${view}")  ;;
                *) error "Unknown --view type [$view]"       ;;
            esac
        done # views[@]
    done # repos[@]

    for r in "${ref[@]}";
    do
        echo "REPO: $r"
    done

    return
}

## -----------------------------------------------------------------------
## -----------------------------------------------------------------------
function get_urls()
{
    local -n ref="$1"; shift
    local _srv="$1"; shift

    local gerrit="https://${_srv}"
    ref=(\
         ['admin']="$gerrit/admin/repos"
         ['base']="$gerrit"\
         ['dashboard']="$gerrit/dashboard/self"\
    )
    return
}

## -----------------------------------------------------------------------
## -----------------------------------------------------------------------
function changeset()
{
    local _repo="$1"; shift
    local _id="$1";   shift
    local -n ref=$1;  shift

    local url="https://gerrit.opencord.org/c/${repo}/+/${id}"
    ref+=("$url")
    return
}

## -----------------------------------------------------------------------
## -----------------------------------------------------------------------
function browse()
{
    local -n _urls=$1; shift
    "${BROWSER}" "${_urls[@]}" >/dev/null 2>/dev/null &
    return
}

## -----------------------------------------------------------------------
## -----------------------------------------------------------------------
function access_url()
{
    local -n ref=$1; shift
    local _repo="$1"; shift

    declare -A data=()
    get_urls data "$serv"

    # declare -p data | tr '=' '\n'
    # ref+=("https://gerrit.opencord.org/admin/repos/${_repo},access")
    ref+=("${data['admin']}/${_repo},access")

    # browse urls
    return
}

## -----------------------------------------------------------------------
## -----------------------------------------------------------------------
function branch_url()
{
    local _repo="$1"; shift
    local -a urls=()
    urls+=("https://gerrit.opencord.org/admin/repos/${_repo},branches")
    browse urls
    return
}

## -----------------------------------------------------------------------
## -----------------------------------------------------------------------
function do_gerrit_dashboard()
{
    local -n ref=$1; shift

    declare -A data=()
    get_urls data "$serv"
    ref+=("${data['dashboard']}")
    return
}

# https://gerrit.opencord.org/q/status:open+-is:wip

# repo=''
declare -a urls=()

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

while [ $# -ne 0 ]; do
    arg="$1"; shift
    case "$arg" in
        --help) usage; exit 0 ;;
        --help-*)
            case "$arg" in
                --help-status) usage_verbose "$arg" ;;
                *) usage ;;
            esac
            exit 0
            ;;

        ## Modes
	    --debug)
            declare -g -i argv_debug=1
            declare -g -i debug=1
            ;;
        --search) declare -g -i argv_search=1 ;;

        --me)
            declare -g -i argv_me=1
            me+=("owner:${USER}@opennetworking.org")
            ;;

        --todo) source "$root/gerrit/todo.sh" ;;

        --wip)
            declare -a args=()
            args=('--status' 'open')
            [[ $# -gt 0 ]] && { args+=("$@"); }
            set -- "${args[@]}"
            ;;

        --admin)
            [[ ! -v admins ]] && { declare -a admins=(); }
            arg="$1"; shift
            case "$arg" in
                br*) admins+=('branches') ;;
                ta*) admins+=('tags') ;;
                *) error "Unknown --attr value [$attr]" ;;
                ## Also master and voltha-2.12
                # https://gerrit.opencord.org/plugins/gitiles/voltha-go/+/refs/heads/voltha-2.12
            esac
            ;;

        --all)
            repo="$1"; shift
            declare -a args=()
            args+=('--repo'  "$repo")
            #
            args+=('--admin' 'branches')
            args+=('--admin' 'tags')

            # args+=('--view') # post getopts expansion
            #   if @versions() else master
            if [[ ${#versions[@]} -eq 0 ]]; then
                versions+=('master')
            fi

#            args+=('--view'  'voltha-2.11')
            args+=('--view'  'voltha-2.12')
            set -- "${args[@]}" "$@"
            ;;

        --repo)
            repo="$1"; shift
            [[ ! -v repos ]] && { declare -a repos=(); }
            repos+=("$repo")
            ;;

        --serv) serv="$1"; shift
                case "$serv" in
                    *cord*) serv='gerrit.opencord.org'    ;;
                    *onos*) serv='gerrit.onosproject.org' ;;
                    *) error "Detected invalid --serv $serv" ;;
                esac
                ;;

        --access)
            [[ ! -v repo ]] && { error "--repo is required"; }
            access_url urls "$repo"
            ;;

        --branch)
            [[ ! -v repo ]] && { error "--repo is required"; }
            branch_url "$repo"
            ;;

        --crowd*)
            # https://crowd.opennetworking.org/crowd/console/secure/group/browse.action?directoryId=163841&updateSuccessful=
            declare https='https://crowd.opennetworking.org'
            declare base_url="${https}/crowd/console/secure/group/browse.action"
            case "$arg" in
                --crowd-*)
                    # urls+=("${base_url}?directoryId=163841&updateSuccessful=")
                    urls+=("${base_url}")
                    ;;
                *)
                    # https://crowd.opennetworking.org/crowd/console/secure/group/browse.action?search=%22VOLTHACore%22
                    [[ $# -eq 0 ]] && { error "--crowd requires an argument"; }
                    arg="$1"; shift
                    urls+=("${base_url}?search=%22${arg}%22")
                    ;;
            esac
            ;;

        --*desk) error "Try --dashboard instead" ;;
        --dash*) do_gerrit_dashboard urls ;;

        #
        --group*)
            case "$arg" in
                --group*)
                    urls+=("https://${serv}/admin/groups")
                    ;;
                *)
                    [[ $# -eq 0 ]] && { error "--group requires an argument"; }
                    arg="$1"; shift
                    urls+=("https://${serv}/admin/groups/q/filter:${arg}}")
                    ;;
            esac
            ;;

        --id)
            id="$1"; shift
            [[ ${#repo} -eq 0 ]] && { error "--repo is required"; }
            changeset "$repo" "$id" urls
            ;;

        --status)
            arg="$1"; shift # open, closed, merged
            case "$arg" in
                closed|open|merged) add_filter_status "$arg";;
                *) error "Detected invalid --status [$arg]" ;;
            esac
            ;;

        --patch*)
            repo="$1"; shift
            urls+=("https://gerrit.opencord.org/q/${repo}+status:open")
            # https://gerrit.opencord.org/q/voltha-openolt-adapter-go
            ;;

        --reviewer)
            arg="$1"; shift
            add_filter_reviewer "$arg"

            declare -g -i argv_review=1
            # Replace with: set -- '--review' "$@"
            ;;

        --review) declare -g -i argv_review=1 ;;

        --ver*)
            [[ $# -eq 0 ]] && { error "Usage: $arg [str]"; }
            arg="$1"; shift
            [[ ! -v versions ]] && { declare -a versions=(); }
            versions+=("$arg")
            ;;

        # post getopt expansion to support --version x --version y
        --view)
            [[ $# -eq 0 ]] && { set -- '--default'; }
            arg="$1"; shift
            # [[ "${#views[@]}" -gt 0 ]]
            [[ ! -v views ]] && { declare -A views=(); }
            case "$arg" in

                search*)
                    urls+=('https://gerrit.opencord.org/admin/repos')
                    ;;

                repo) views['repository']=1 ;;

                # https://gerrit.opencord.org/plugins/gitiles/voltha-go
                master) views['master']=1 ;;
                voltha*) views["$arg"]=1  ;;
                v*) views["$arg"]=1       ;;
                *)
                    # Missing latest tags
                    views['default']=1
                    views['master']=1
                    ;;
            esac
            ;;

	    -*)
	        echo "ERROR: Unknown argument [$arg]"
	        exit 1
	        ;;

	    [[:alnum:]]*)
            declare -a what=()
            # whats+=('patches')
            whats+=('versions')

            stem="https://gerrit.opencord.org/q/${arg}"

            for what in "${whats[@]}";
            do
                case "$what" in
                    patches) urls+=("https://gerrit.opencord.org/q/${arg}") ;;
                    versions)
                        urls+=("https://gerrit.opencord.org/plugins/gitiles/${arg}/+/refs/heads/master/VERSION")
                        # urls+=("https://gerrit.opencord.org/plugins/gitiles/${arg}/+/refs/tags/v0.3.6/VERSION")
                        urls+=("https://gerrit.opencord.org/plugins/gitiles/${arg}/+/refs/heads/voltha-2.12/VERSION")
                        ;;
                    '??') urls+=("https://gerrit.opencord.org/plugins/gitiles/${arg}") ;;
                    *) urls+=("https://gerrit.opencord.org/q/${arg}") ;;
                esac
            done
    esac
done

[[ -v argv_search ]]   && { do_gerrit_search urls repos argv_status; }
[[ -v admins ]]      && { gen_admin_urls urls repos admins; }

# -----------------------------------------------------------------------
# Generalize:
#   o --review function like a simple search filter.
#   o piece missing is defining query URL stem= when needed.
# -----------------------------------------------------------------------
[[ -v argv_review ]] && { do_gerrit_review urls repos argv_status; }

## are --views working ?
[[ "${#views[@]}" -gt 0 ]] && { gen_view_urls  urls repos views;  }

if [[ ${#urls[@]} -eq 0 ]]; then
    declare -a show_all=() # show all for visiblity
    do_gerrit_search urls repos show_all
fi


[[ -v debug ]] && { echo "$BROWSER" "${urls[@]}"; }

if [[ ${#urls[@]} -gt 0 ]]; then
    apply_filter_status urls
    browse urls
fi

## -----------------------------------------------------------------------
## [TODO]
## Query patches by repo:voltha-lib-go
##     ssh gerrit.opencord.org  gerrit query --patch-sets projects:voltha-lib-go | grep -i description
#      ssh gerrit.opencord.org  gerrit query --patch-sets 'projects:voltha-lib-go AND status:open limit:2' |

# Show URL and Commit message
# ssh gerrit.opencord.org  gerrit query --format=JSON --patch-sets 'projects:voltha-lib-go AND status:open limit:2' | jq '.url,.commitMessage'
## -----------------------------------------------------------------------

# [EOF]


# 1) gerrit.sh --search --me --wip
#    query> owner:joey@opennetworking.org status:open

# --search --me
#            args+=("owner:${USER}@opennetworking.org")

#        --wip)
#            argv_status+=('status:open')
#            ;;


# [EOF]
