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

___x_cmd_gt_repo_pr_tester(){
    param:scope     ___x_cmd_gt
    param:subcmd ___x_cmd_gt_repo_pr_tester                 \
        add             "Add tester"                        \
        rm              "Reomve tester"                     \
        reset           "Reset  tester"                     \
        test            "Test pass"
    param:subcmd:try
    param:run

    ___x_cmd_gt_repo_pr_tester _param_help_doc
    return 1
}

# Section: Add
# https://gitee.com/api/v5/swagger#/postV5ReposOwnerRepoPullsNumberTesters
___x_cmd_gt_repo_pr_tester_add(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1                 "pr number"                                                          <>:NatureNumber
    --testers          "testers username list. separated by commas(,)"                      <>:UserName
    --repo|-r          "<owner_path>/<repo_path>"                                           <>:RepoPath
    --json|-j          "output origin json data"
'
    param:run
    [ -n "$1" ] || M='accepts 1 arg(PR number), received empty' arg:ret:64
    local pr="$1"
    ___parse_pr_init_owner_repo_and_pr

    ___x_cmd_gt_curl post "/repos/${owner_repo}/pulls/$pr/testers" -- testers | \
        ___x_cmd_gt_repo_pr_tester____ui_handler Add
}

# EndSection

# Section: Remove
# https://gitee.com/api/v5/swagger#/deleteV5ReposOwnerRepoPullsNumberTesters
___x_cmd_gt_repo_pr_tester_rm(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1                  "pr number"                                                          <>:NatureNumber
    --testers           "testers username list. separated by commas(,)"                      <>:UserName
    --repo|-r           "<owner_path>/<repo_path>"                                           <>:RepoPath
    --json|-j           "output origin json data"
'
    param:run
    [ -n "$1" ] || M='accepts 1 arg(PR number), received empty' arg:ret:64
    local pr="$1"
    ___parse_pr_init_owner_repo_and_pr

    ___x_cmd_gt_curl del "/repos/${owner_repo}/pulls/$pr/testers" "testers" | \
        ___x_cmd_gt_repo_pr_tester____ui_handler Remove
}

# EndSection

# Section: Reset
# https://gitee.com/api/v5/swagger#/patchV5ReposOwnerRepoPullsNumberTesters
___x_cmd_gt_repo_pr_tester_reset(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1                 "pr number"                              <>:NatureNumber
    --repo|-r          "<owner_path>/<repo_path>"               <>:RepoPath
    --reset_all        "reset all tester"
    --json|-j          "output origin json data"
'
    param:run
    [ -n "$1" ] || M='accepts 1 arg(PR number), received empty' arg:ret:64
    local pr="$1"
    reset_all=${reset_all:-false}
    ___parse_pr_init_owner_repo_and_pr

    ___x_cmd_gt_curl patch "/repos/${owner_repo}/pulls/$pr/testers" -- reset_all | \
        ___x_cmd_gt_repo_pr_tester____ui_handler Reset
}
# EndSection

# Section: assign test
# https://gitee.com/api/v5/swagger#/postV5ReposOwnerRepoPullsNumberTest
# shellcheck disable=SC2034
___x_cmd_gt_repo_pr_tester_test(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1                "pr number"                           <>:NatureNumber
    --repo|-r         "<owner_path>/<repo_path>"            <>:RepoPath
    --force           "force"
    --json|-j         "output origin json data"
'
    param:run
    [ -n "$1" ] || M='accepts 1 arg(PR number), received empty' arg:ret:64
    local pr="$1"
    force=${force:-false}
    ___parse_pr_init_owner_repo_and_pr
    ___x_cmd_gt_curl post "/repos/${owner_repo}/pulls/$pr/test" -- force | (
            [ -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]: Resolve $pr test pass to $owner_repo"
            else
                ___x_cmd_ui_tf false "Resolve $pr test pass to $owner_repo failure:" >&2
                ___x_cmd_gt____handle_resp
                return 1
            fi
        )
}
# EndSection

# Section: pr tester UI
___x_cmd_gt_repo_pr_tester____ui_handler(){
     if [ -n "$ENFORCE_JSON" ] || [ -n "$json" ]; then
        ___x_cmd_cmds_cat
        ___x_cmd_gt_http_error
        return
    fi
    (
        case "$1" in
            Add|Remove)
                _inf_msg="[Success]: $1 $assignees as $owner_repo $number PR tester"
                _err_msg="$1 $assignees as $owner_repo $number PR tester failure:"
            ;;
            Reset)
                _inf_msg="[Success]: Reset $number to $owner_repo tester"
                _err_msg="Reset $number to $owner_repo tester failure:"
            ;;
        esac
        local _number=""
        x jo env . _number=.number gt_resp_err=.message gt_resp_err=.error
        if [ -n "$_number" ]; then
            ___x_cmd_ui_tf  true "${_inf_msg}" ${url:+"URL: $url"}
        else
            ___x_cmd_ui_tf false "${_err_msg}" >&2
            ___x_cmd_gt____handle_resp
            return 1
        fi
    )
}
# EndSection