# shellcheck shell=sh
# shellcheck disable=SC2039,3043,2086,2154,2120
___x_cmd_gt_repo_pr_assign(){
    param:scope     ___x_cmd_gt
    param:subcmd ___x_cmd_gt_repo_pr_assign             \
        add             "Add assignee"                  \
        rm              "Remove assignee"               \
        reset           "Reset  assignee"               \
        review          "Review pass"
    param:subcmd:try
    param:run

    ___x_cmd_gt_repo_pr_assign _param_help_doc
    return 1
}

# Section: assign Add
# https://gitee.com/api/v5/swagger#/postV5ReposOwnerRepoPullsNumberAssignees
___x_cmd_gt_repo_pr_assign_add(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1              "pr number"                                                             <>:NatureNumber
    --repo|-r       "<owner_path>/<repo_path>"                                              <>:RepoPath
    --assignees     "reviewer username list. separated by commas(,)"                        <>:UserName
    --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/assignees" -- assignees | \
        ___x_cmd_gt_repo_pr_assign____ui_handler Add
}
# EndSection

# Section: assign del
# https://gitee.com/api/v5/swagger#/deleteV5ReposOwnerRepoPullsNumberAssignees
___x_cmd_gt_repo_pr_assign_rm(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1              "pr number"                                                             <>:NatureNumber
    --assignees     "reviewer 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/assignees" assignees | \
        ___x_cmd_gt_repo_pr_assign____ui_handler Remove
}

# EndSection

# Section: assign reset
# https://gitee.com/api/v5/swagger#/patchV5ReposOwnerRepoPullsNumberAssignees
___x_cmd_gt_repo_pr_assign_reset(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1                  "pr number"                             <>:NatureNumber
    --repo|-r           "<owner_path>/<repo_path>"              <>:RepoPath
    --reset_all         "is reset all assigner"
    --json|-j           "output origin json data"
'
    param:run
    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/assignees" -- reset_all | \
        ___x_cmd_gt_repo_pr_assign____ui_handler Reset
}
# EndSection

# Section: assign review
# https://gitee.com/api/v5/swagger#/postV5ReposOwnerRepoPullsNumberReview
# shellcheck disable=SC2034
___x_cmd_gt_repo_pr_assign_review(){
    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
    local pr="$1"
    force=${force:-false}
    ___parse_pr_init_owner_repo_and_pr
    ___x_cmd_gt_curl post "/repos/${owner_repo}/pulls/$pr/review" -- 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 review pass to $owner_repo"
            else
                ___x_cmd_ui_tf false "Resolve $pr review pass to $owner_repo failure:" >&2
                ___x_cmd_gt____handle_resp
                return 1
            fi
        )
}
# EndSection

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