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

___x_cmd_gt_repo_hook(){
    param:scope         ___x_cmd_gt
    param:subcmd ___x_cmd_gt_repo_hook               \
        ls              "List   repo webhook"                        \
        create          "Create repo webhook"                        \
        info            "Show   repo webhook detailed information"   \
        "edit|ed"       "Edit   repo webhook configure"              \
        rm              "Remove repo webhook"                        \
        test            "Try    repo webhook url test connect"
    param:subcmd:try
    param:run

    ___x_cmd_gt_repo_hook _param_help_doc
    return 1
}

# Section: List

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

    --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}/hooks" | ___x_cmd_gx_output_format
    else
        ___x_cmd_gt_get_multi "/repos/${owner_repo}/hooks" | \
            x jo 2c             .id  .url  .result_code .push_events .tag_push_events .issues_events .note_events .merge_requests_events | \
            x csv header --add   Id   Url   ResultCode   PushEvents   TagPushEvent     IssuesEvent    NoteEvent    MergeRequestEvent     | \
            if [ -n "$csv" ]; then  ___x_cmd_cmds cat
            else                    x csv static_tab
            fi
    fi
}
# EndSection

# Section: Info

# https://gitee.com/api/v5/swagger#/getV5ReposOwnerRepoHooksId
___x_cmd_gt_repo_hook_info(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1                "webhooks id"                         <>:NatureNumber
    --repo|-r         "<owner_path>/<repo_path>"            <>:RepoPath
    --json|-j         "output origin json data"
'
    param:run
    [ -n "$1" ] || M='accepts 1 arg(webhooks id), received empty' arg:ret:64
    local id="$1"
    ___x_cmd_gt_param_init_owner_repo

    ___x_cmd_gt_curl get "/repos/${owner_repo}/hooks/${id}" | \
        ___x_cmd_gt_repo_hook____ui_handler Info "$id"
}

# EndSection

# Section: Create

# https://gitee.com/api/v5/swagger#/postV5ReposOwnerRepoHooks
___x_cmd_gt_repo_hook_create(){
    param:scope     ___x_cmd_gt
    param:dsl       '
type:
    HookEncryptionType =  password signkey ""
options:
    --repo|-r                   "<owner_path>/<repo_path>"                                           <>:RepoPath
    --url                       "webhooks remote url"                                                <>:Address

    --encryption_type           "encryption type"                                                    <>:HookEncryptionType=""
    --password                  "Requesting a URL with password to prevent maliciously request"      <>=""
    --no_push_events            "Turn off push code event(default is push code event)"
    --tag_push_events           "Turn on push tag event"
    --issues_events             "Turn on create|close issue event"
    --note_events               "Turn on note code|issue event"
    --merge_requests_events     "Turn on merge request|merged event"
    --json|-j                   "output origin json data"
'
    param:run
    case "$encryption_type" in
        password)          encryption_type=0                    ;;
        signkey)           encryption_type=1                    ;;
    esac
    local gen_gt_json
    gen_gt_json="$(
        param:option2json -repo  'push_events=^no_push_events' \
            'tag_push_events=^^tag_push_events'   'issues_events=^^issues_events' \
            'note_events=^^note_events'           'merge_requests_events=^^merge_requests_events' )"
    gt:debug "$gen_gt_json"

    ___x_cmd_gt_param_init_owner_repo
    ___x_cmd_gt_curl post "/repos/${owner_repo}/hooks" "gen_gt_json" | \
        ___x_cmd_gt_repo_hook____ui_handler Creating
}

# EndSection

# Section: Edit
# https://gitee.com/api/v5/swagger#/patchV5ReposOwnerRepoHooksId
___x_cmd_gt_repo_hook_edit(){
    param:scope     ___x_cmd_gt
    param:dsl       '
type:
    HookEncryptionType =  password signkey ""
options:
    #1                          "webhooks id"                                                        <>:NatureNumber
    --repo|-r                   "<owner_path>/<repo_path>"                                           <>:RepoPath
    --url                       "webhooks remote url"                                                <>:Address

    --encryption_type           "encryption type"                                                    <>:HookEncryptionType=""
    --password                  "Requesting a URL with password to prevent maliciously request"      <>=""
    --no_push_events            "Turn off push code event(default is push code event)"
    --tag_push_events           "Turn on push tag event"
    --issues_events             "Turn on create|close issue event"
    --note_events               "Turn on note code|issue event"
    --merge_requests_events     "Turn on merge request|merged event"
    --json|-j                   "output origin json data"
'
    param:run
    [ -n "$1" ] || M='accepts 1 arg(webhooks id), received empty' arg:ret:64
    local id="$1"
    case "$encryption_type" in
        password)          encryption_type=0                    ;;
        signkey)           encryption_type=1                    ;;
    esac
    local gen_gt_json
    gen_gt_json="$(
        param:option2json  -repo -id   'push_events=^no_push_events' \
            'tag_push_events=^^tag_push_events'   'issues_events=^^issues_events' \
            'note_events=^^note_events'           'merge_requests_events=^^merge_requests_events' )"
    gt:debug "$gen_gt_json"

    ___x_cmd_gt_param_init_owner_repo
    ___x_cmd_gt_curl patch "/repos/${owner_repo}/hooks/${id}" "gen_gt_json" | \
        ___x_cmd_gt_repo_hook____ui_handler Modify
}

# EndSection

# Section: Remove
# https://gitee.com/api/v5/swagger#/deleteV5ReposOwnerRepoHooksId
___x_cmd_gt_repo_hook_rm(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1                "webhooks id"                                         <>:NatureNumber
    --repo|-r         "<owner_path>/<repo_path>"                            <>:RepoPath
    --yes|-y          "Ignore remove prompt interception"
'
    param:run
    [ -n "$1" ] || M='accepts 1 arg(webhooks id), received empty' arg:ret:64
    ___x_cmd_gt_param_init_owner_repo

    [ "$yes" = "true" ] || ___x_cmd_ui_yesno "Are you sure to $owner_repo remove hook: $(___x_cmd_ui bold red "$id") ?" || return 1
    ___x_cmd_gt_curl del "/repos/${owner_repo}/hooks/${id}" | (
            [ -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 $id hook to repo $owner_repo"
            else
                ___x_cmd_ui_tf false "Remove $id hook to repo $owner_repo failure:" >&2
                ___x_cmd_gt____handle_resp
                return 1
            fi
        )
}

# EndSection

# Section: Test

# https://gitee.com/api/v5/swagger#/postV5ReposOwnerRepoHooksIdTests
___x_cmd_gt_repo_hook_test(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1                "webhooks id"                         <>:NatureNumber
    --repo|-r         "<owner_path>/<repo_path>"            <>:RepoPath
'
    param:run
    [ -n "$1" ] || M='accepts 1 arg(webhooks id), received empty' arg:ret:64
    local id="$1"
    ___x_cmd_gt_param_init_owner_repo

    ___x_cmd_gt_curl post "/repos/${owner_repo}/hooks/${id}/tests" | (
            [ -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]: Testing $id hook on repo $owner_repo. Please check remote url is received"
            else
                ___x_cmd_ui_tf false "Test $$id hook to $owner_repo failure:" >&2
                ___x_cmd_gt____handle_resp
                return 1
            fi
        )
}

# EndSection

# Section: repo hook UI
___x_cmd_gt_repo_hook____ui_handler(){
    if [ -n "$ENFORCE_JSON" ] || [ -n "$json" ]; then
        ___x_cmd_cmds_cat
        ___x_cmd_gt_http_error
        return
    fi
    (
        case "$1" in
            Creating|Modify)
                _inf_msg="$1 webhooks on $owner_repo successfully"
                _err_msg="$1 webhooks on $owner_repo failure"
            ;;
            Info)
                _inf_msg="$owner_repo $2 webhooks information"
                _err_msg="No find any repo webhooks data by $owner_repo $2"
            ;;
        esac
        local _id=""
        x jo env . _id=.id gt_resp_err=.message gt_resp_err=.error \
            url=.url result_code=.result_code password=.password created_at=.created_at push_events=.push_events tag_push_events=.tag_push_events issues_events=.issues_events note_events=.note_events merge_requests_events=.merge_requests_events
        if [ -n "$_id" ]; then
            ___x_cmd_ui_tf  true "${_inf_msg}:" ${_id:+"ID: $_id"} ${result_code:+"result_code: $result_code"} ${password:+"Password: $password"} ${created_at:+"Created At: $created_at"} \
                ${push_events:+"Push Events: $push_events"} ${tag_push_events:+"Tag Push Events: $tag_push_events"} ${issues_events:+"Issues Events: $issues_events"} \
                ${note_events:+"Note Events: $note_events"} ${merge_requests_events:+"Merge Requests Events: $merge_requests_events"} ${url:+"URL: $url"}
        else
            ___x_cmd_ui_tf false "${_err_msg}:" >&2
            ___x_cmd_gt____handle_resp
            return 1
        fi
    )
}
# EndSection