# shellcheck shell=sh
# shellcheck disable=SC2039,3043

# Should be like this.
# gt repo collaborator add el:admin
# gt repo collaborator remove user-a
# gt repo collaborator add user-b

# gt repo collaborator +el:admin -user-a +user-b
# shellcheck disable=SC2154,SC2086
___x_cmd_gt_repo_collaborator(){
    param:subcmd ___x_cmd_gt_repo_collaborator                \
        ls              "Interactive UI show repo of user"    \
        ll              "List   repo collaborator"            \
        "edit|ed"       "Edit   repo collaborator role"       \
        add             "Add    repo collaborator"            \
        rm              "Remove repo collaborator"
    param:subcmd:try
    param:run

    ___x_cmd_gt_repo_collaborator_ls
}

# Section: List
# shellcheck disable=SC2120
___x_cmd_gt_repo_collaborator_ls(){
    if ___x_cmd_gx_has_format_args "$@"; then
        ___x_cmd_gt_repo_collaborator_ll "$@"
        return
    fi
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    --repo|-r           "<owner_path>/<repo_path>"              <>:RepoPath
    --page              "page"                                  <>="1"
    --per_page          "per_page"                              <>="20"
'
    param:run

    local ___gt_error_msg=
    ___x_cmd_gt_param_init_owner_repo
    if ___x_cmd_gx_is_interactive_env; then
        local ___X_CMD_TUI_TABLE_FINAL_COMMAND
        local ___X_CMD_TUI_TABLE_CUR_LINE
        local ___X_CMD_TUI_TABLE_CUR_ITEM
        ___x_cmd_gt_tui_app  --page "$page" --per_page "$per_page" --owner_repo "$owner_repo" \
            --request-code '___x_cmd_gt_get_multi "/repos/${owner_repo}/collaborators" page  per_page' \
            --error-msg "Couldn't find any data by: $owner_repo" \
            --end ___x_cmd_gt_repo_collaborator_status_handler \
            "repo.collaborator.app.awk"
    else
        ___x_cmd_gt_get_multi "/repos/${owner_repo}/collaborators" | \
            x jo 2c    .login
    fi
}

___x_cmd_gt_repo_collaborator_status_handler(){
    if [ ! -t 1 ] || [ -n "$ENFORCE_JSON" ]; then
        ___x_cmd_gt_http_error
        return
    fi
    local user_name=""
    user_name="${___X_CMD_TUI_TABLE_CUR_LINE##*NameSpace: }"
    user_name="${user_name%%
Name: *}"
    case "$___X_CMD_TUI_TABLE_FINAL_COMMAND" in
            "ENTER")        printf "%s\n" "$___X_CMD_TUI_TABLE_FINAL_COMMAND"  ;;
            "c")            ___x_cmd_gt_repo_collaborator_add    --repo "${owner_repo}"                               ;;
            "u")            ___x_cmd_gt_repo_collaborator_edit   --repo "${owner_repo}"    "$user_name"               ;;
            "d")            ___x_cmd_gt_repo_collaborator_rm     --repo "${owner_repo}"    "$user_name"               ;;
            *)              return   ;;
    esac
}
# EndSection

# Section: List

# https://gitee.com/api/v5/swagger#/getV5ReposOwnerRepoCollaborators
___x_cmd_gt_repo_collaborator_ll(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    --repo|-r           "<owner_path>/<repo_path>"              <>:RepoPath
    --page              "page"                                  <>="1"
    --per_page          "per_page"                              <>="30"

    --json|-j   "output origin json data"
    --csv       "output csv data"
    --yml       "output yml data"
'
    param:run
    ___x_cmd_gt_param_init_owner_repo
    if ___x_cmd_gx_output_is_format; then
        ___x_cmd_gt_get_multi "/repos/${owner_repo}/collaborators" | ___x_cmd_gx_output_format
    else
        ___x_cmd_gt_get_multi "/repos/${owner_repo}/collaborators" | \
            x jo 2c             .login     .name  .permissions.admin  .permissions.push .permissions.pull | \
            x csv header --add   NameSpace  Name   Admin               Push_Permission   Pull_Permission  | \
            if [ -n "$csv" ]; then  ___x_cmd_cmds cat
            else                    x csv static_tab
            fi
    fi
}

# EndSection

# Section: Add Edit

# shellcheck disable=SC2181,SC2154
# https://gitee.com/api/v5/swagger#/putV5ReposOwnerRepoCollaboratorsUsername
___x_cmd_gt_repo_collaborator_add(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1                  "Provide user login path"                   <>:UserName
    --repo|-r           "<owner_path>/<repo_path>"                  <>:MultipleRepoPath
    --permission|-p     "collaborator permission(pull,push,admin)"  <>:RepoPerm
    --json|-j           "output origin json data"
'
    param:run
    [ "$#" -ne 0 ] || M='accepts 1 arg(s) (user login path), received empty' arg:ret:64
    local _avt_name=""
    local _tmp_repo="$repo"
    # TODO: N to N && 1 TO N & N to 1
    while true; do
        repo="${_tmp_repo%%,*}"
        _tmp_repo="${_tmp_repo#*,}"
        ___x_cmd_gt_param_init_owner_repo
        for _avt_name in "$@"; do
            ___x_cmd_gt____transform_avt_name || return
            # To Update
            [ -z "$_____X_CMD_GT___REPO_COLLABORATOR_EDIT" ] || ___x_cmd_gt_repo_collaborator_rm --repo $owner_repo --yes "${_avt_name##*/}" 1>/dev/null 2>&1
            ___x_cmd_gt_curl put "/repos/$owner_repo/collaborators/${_avt_name##*/}" -- permission | \
                ___x_cmd_gt_repo_collaborator____ui_handler Resolve
        done
        [ "$repo" != "$_tmp_repo" ] || return 0
    done
}

___x_cmd_gt_repo_collaborator_edit(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1                  "Username list separated by commas(,)"              <>:UserName
    --repo|-r           "<owner_path>/<repo_path>"                          <>:MultipleRepoPath
    --permission|-p     "collaborator permission(pull,push,admin)"          <>:RepoPerm
    --json|-j           "output origin json data"
'
    param:run
    if [ "$1" = "$(___x_cmd_gt_cfg get owner)" ]; then
        ___x_cmd_gt_param_init_owner_repo
        gt:error "Gitee unable to edit personal permission through api. Please move website" \
            "$(printf "\033[4;33m%s\033[0m" "https://gitee.com/${owner_repo}/team")"
        return 1
    fi
    _____X_CMD_GT___REPO_COLLABORATOR_EDIT=1 ___x_cmd_gt_repo_collaborator_add --repo "$repo" --permission "$permission" "$1"
}

# EndSection

# Section: Remove

# shellcheck disable=SC2181,SC2034
# https://gitee.com/api/v5/swagger#/deleteV5ReposOwnerRepoCollaboratorsUsername
___x_cmd_gt_repo_collaborator_rm(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1              "Username list."                        <>:UserName
    --repo|-r       "<owner_path>/<repo_path>"              <>:RepoPath
    --yes|-y        "Ignore remove prompt interception"
'
    param:run
    ___x_cmd_gt_param_init_owner_repo

    local _avt_name=""
    local _exit_code=0
    for _avt_name in "$@"; do
        ___x_cmd_gt____transform_avt_name || return
        [ "$yes" = "true" ] || ___x_cmd_ui_yesno "Are you sure to $owner_repo remove user: $(___x_cmd_ui bold red "$_avt_name") ?" || continue
        ___x_cmd_gt_curl del "/repos/$owner_repo/collaborators/${_avt_name##*/}" | (
            [ -z "$___X_CMD_GT_IN_TEST" ] || { ___x_cmd_cmds_cat; return; }
            x jo env . gt_resp_err=.message gt_resp_err=.error
            if ___x_cmd_gt_http_error; then
                ___x_cmd_ui_tf true  "[Success]: Remove $_avt_name to $owner_repo"
            else
                gt:debug "remove repo error. exit_code $exit_code"
                ___x_cmd_ui_tf false "Remove $_avt_name to $owner_repo failure:" >&2
                ___x_cmd_gt____handle_resp
                return 1
            fi
        )
    done
}

# EndSection

# Section: repo collaborator UI
___x_cmd_gt_repo_collaborator____ui_handler(){
    if [ -n "$ENFORCE_JSON" ] || [ -n "$json" ]; then
        ___x_cmd_cmds_cat
        ___x_cmd_gt_http_error
        return
    fi
    (
        case "$1" in
            Resolve)
                if [ -n "$_____X_CMD_GT___REPO_COLLABORATOR_EDIT" ]; then
                    _inf_msg="[Success]: Edit collaborator $_avt_name on $owner_repo"
                else
                    _inf_msg="[Success]: Add collaborator $_avt_name on $owner_repo"
                fi
                _err_msg="Resolve $_avt_name user to $owner_repo failure:"
            ;;
        esac
        local _id=""
        x jo env . _id=.id gt_resp_err=.message gt_resp_err=.error \
            permissions=.permissions.${permission}
        if [ -n "$_id" ]; then
            if [ "$permissions" = "false" ] && [ -z "$_____X_CMD_GT___REPO_COLLABORATOR_EDIT" ]; then
                gt:info "$_avt_name already exists in $owner_repo"
                return 0
            fi
            ___x_cmd_ui_tf  true "${_inf_msg}"
        else
            ___x_cmd_ui_tf false "${_err_msg}" >&2
            ___x_cmd_gt____handle_resp
            return 1
        fi
    )
}

# EndSection
