# shellcheck shell=sh disable=SC3043,2002,SC2154

# x gl repo apply a.yml lijunhao=edwinjhlee zhengyuhang=mnnna
# x gl repo apply .x-cmd/apply/gitlab-repo.yml  lijunhao=edwinjhlee
___x_cmd_gl_repo_apply(){
    param:void
    if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then ___x_cmd_gl_repo_apply__help; return;
    fi


    local filepath="${1:?Provide filepath}"; shift

    local code; if code="$(
        {
            eval 'case "$filepath" in
                -)              ___x_cmd_cmds_cat | x y2j ;;
                *.json)         ___x_cmd_cmds_cat "$filepath" ;;
                *)              <"$filepath" x y2j ;;
            esac' |
             {
                x jo env . content=. owner_repo=.repo  apply_member=.member
                [ -n "$owner_repo" ] || { gl:error "Not found apply configure repo main key" >/dev/stderr; return 1; }
                ___x_cmd_gl_repo_apply__replace "$@"
                printf "%s\n" "$content"
                gl:info "Getting repo info ..."
                ___x_cmd_gl_repo_apply__member_info
                ___x_cmd_gl_repo_apply__repo_info
            }
        } | {
            ___x_cmd_cmds_awk -f "$___X_CMD_ROOT_MOD/awk/lib/core.awk" \
                -f "$___X_CMD_ROOT_MOD/awk/lib/sh.awk" \
                -f "$___X_CMD_ROOT_MOD/awk/lib/j/json.awk" \
                -f "$___X_CMD_ROOT_MOD/awk/lib/j/jiter.awk" \
                -f "$___X_CMD_ROOT_MOD/gl/lib/awk/repo/member.awk"  \
                -f "$___X_CMD_ROOT_MOD/gl/lib/awk/repo.awk" \
                -f "$___X_CMD_ROOT_MOD/gl/lib/awk/replace.awk" \
                -f "$___X_CMD_ROOT_MOD/gl/lib/repo/apply/apply.awk"
        }
    )"; then
        # gl:debug "apply code: $code"
        # [ -n "$code" ] || {
        #     printf "%s\n" ""; gl:info "Repo apply no changes required"
        #     return 0
        # }
        # gl:info "Handling repo by info ..."
        # if [ -n "$___X_CMD_GH_DRY_RUN" ]; then      printf "%s\n" "$code";
        # else                                        eval "$code";
        # fi
        echo "$code"
    else
        code=$?
        gl:error "Exit=$code. Fail to apply: $filepath" >/dev/stderr
    fi
}

# shellcheck disable=SC2154
# https://docs.gitlab.com/ee/api/members.html
___x_cmd_gl_repo_apply__member_info(){
    [ -n "$apply_member" ] || { printf "\n"; return 0; }

    NO_CACHE=1 x gl repo member ls --json --repo "$owner_repo" | x ja t "\t" ; printf "\n"
    # cat "$(x wsroot)"/.x-cmd/repo_member.json | x ja t "\t" ; printf "\n"
}

# https://docs.gitlab.com/ee/api/projects.html#list-all-projects
___x_cmd_gl_repo_apply__repo_info(){
    NO_CACHE=1  x gl repo info --json "$owner_repo" | x ja t "\t" ; printf "\n"
    # cat "$(x wsroot)"/.x-cmd/repo_info.json | x ja t "\t" ; printf "\n"
}

___x_cmd_gl_repo_apply__replace(){
    if [ $# -gt 0 ]; then
        local IFS=","; printf "replace:%s\n" "$*"
        return
    else
        printf "%s\n" "{}"
    fi
    # cat "$(x wsroot)"/.x-cmd/lteam-member.yml | x y2j | x ja t "\t" ; printf "\n"
}

___x_cmd_gl_repo_apply__help(){
    printf "\033[1m%s\033[0m\n\n\033[33m%s\033[0m\n    \033[36m%s\033[0m\n    \033[36m%s\033[0m\n" \
        "x gl repo apply <filepath | '-' config from stdin> <...alias name list>" \
        "Example" \
        "x gl repo apply repo.yml bot=x-cmd-bot" \
        "cat ./repo.yml | x gl repo apply - bot=x-cmd-bot"
}
