# shellcheck shell=sh
# shellcheck disable=SC2039,3043
___x_cmd_gcode_repo_hook(){
    param:subcmd ___x_cmd_gcode_repo_hook     \
        ls              "list repo hook"     \
        info            "get hook info"      \
        create          "create hook"        \
        "edit|ed"       "update hook"        \
        rm              "remove hook"
    param:subcmd:try
    param:run

    ___x_cmd_gcode_repo_hook _param_help_doc
    return 1
}

# Section: List
# shellcheck disable=2154
# http://localhost:4000/13.7/ee/api/projects.html#list-project-hooks
___x_cmd_gcode_repo_hook_ls() {
    param:scope     ___x_cmd_gcode
    param:dsl       '
options:
    --repo|-r   "<owner_path>/<repo_path> or .id=<repo_id>"     <>
    --json|-j   "output json data"
'
    param:run
    ___x_cmd_gcode_param_init_owner_repo
    if [ -n "$json" ] || [ -n "$ENFORCE_JSON" ]; then
        ___x_cmd_gcode_curl get "/projects/${owner_repo}/hooks"
    else
        ___x_cmd_gcode_curl get "/projects/${owner_repo}/hooks" | \
            x jo 2c             .id .url .push_events | \
            x csv header --add   ID  URL  PushEvents  | \
            x csv static_tab
    fi
}
# EndSection

# Section: info & rm
# http://localhost:4000/13.7/ee/api/projects.html#get-project-hook
___x_cmd_gcode_repo_hook_info() {
    param:scope     ___x_cmd_gcode
    param:dsl       '
options:
    #1          "The unique identifier of the hook."                                             <>:Number
    --repo|-r   "<owner_path>/<repo_path> or .id=<repo_id>"                                      <>

    --json|-j   "output json data"
'
    param:run
    ___x_cmd_gcode_param_init_owner_repo
    ___x_cmd_gcode_curl get "/projects/${owner_repo}/hooks/$1" | _____x_cmd_gcode_hook_ui_utils Info
}

# http://localhost:4000/13.7/ee/api/projects.html#delete-project-hook
# shellcheck disable=2154
___x_cmd_gcode_repo_hook_rm() {
    param:scope     ___x_cmd_gcode
    param:dsl       '
options:
    #1          "The unique identifier of the hook."                                            <>:Number
    --repo|-r   "<owner_path>/<repo_path> or .id=<repo_id>"                                     <>
    --yes|-y    "Ignore remove prompt interception"
'
    param:run
    ___x_cmd_gcode_param_init_owner_repo
    [ "$yes" = "true" ] || ___x_cmd_ui_yesno "Are you sure you want to remove the hook $1 in the $owner_repo ?" || return
    ___x_cmd_gcode_curl del "/projects/${owner_repo}/hooks/$1" | (
        x jo env . gcode_resp_err=.error gcode_resp_msg=.message
        if ___x_cmd_gcode_http_error; then
            ___x_cmd_ui_tf  true "[Success]: Remove repo hook $1 on $repo"
        else
            ___x_cmd_ui_tf false "Remove repo hook $1 on $repo failure:"
            ___x_cmd_gcode____handle_resp
            return 1
        fi
    )
}
# EndSection

# Section: add & update
# http://localhost:4000/13.7/ee/api/projects.html#add-project-hook
___x_cmd_gcode_repo_hook_create() {
    param:scope     ___x_cmd_gcode
    param:dsl       '
options:
    --repo|-r                      "<owner_path>/<repo_path> or .id=<repo_id>"                                      <>
    --url                          "The URL to which the payloads will be delivered."                               <>
    --token                        "Secret token to validate received payloads"                                     <>=""
    --push_events_branch_filter    "Trigger webhook on push events for matching branches only."                     <>=""
    --issues_events                "Trigger webhook on issues events."
    --job_events                   "Trigger webhook on job events."
    --note_events                  "Trigger webhook on note events."
    --push_events                  "Trigger webhook on push events."
    --pipeline_events              "Trigger webhook on pipeline events."
    --tag_push_events              "Trigger webhook on tag push events."
    --wiki_page_events             "Trigger webhook on wiki events."
    --deployment_events            "Trigger webhook on deployment events."
    --merge_requests_events        "Trigger webhook on merge requests events."
    --enable_ssl_verification      "Do SSL verification when triggering the webhook."
    --confidential_note_events     "Trigger webhook on confidential note events."
    --confidential_issues_events   "Trigger webhook on confidential issues events. "

    --json|-j   "output json data"
'
    param:run

    local gen_gcode_json
    gen_gcode_json="$(param:option2json -repo)"

    ___x_cmd_gcode_param_init_owner_repo
    ___x_cmd_gcode_curl post "/projects/${owner_repo}/hooks" "gen_gcode_json" | _____x_cmd_gcode_hook_ui_utils Creating
}

# http://localhost:4000/13.7/ee/api/projects.html#edit-project-hook
___x_cmd_gcode_repo_hook_edit() {
    param:scope     ___x_cmd_gcode
    param:dsl       '
options:
    #1                             "The unique identifier of the webhook."                                             <>:Number
    --repo|-r                      "<owner_path>/<repo_path> or .id=<repo_id>"                                         <>
    --url                          "The URL to which the payloads will be delivered."                                  <>
    --token                        "Secret token to validate received payloads"                                        <>=""
    --push_events_branch_filter    "Trigger webhook on push events for matching branches only."                        <>=""
    --deployment_events            "Trigger webhook on deployment events."
    --issues_events                "Trigger webhook on issues events."
    --job_events                   "Trigger webhook on job events."
    --note_events                  "Trigger webhook on note events."
    --push_events                  "Trigger webhook on push events."
    --pipeline_events              "Trigger webhook on pipeline events."
    --releases_events              "Trigger webhook on release events."
    --tag_push_events              "Trigger webhook on tag push events."
    --wiki_events                  "Trigger webhook on wiki events."
    --merge_requests_events        "Trigger webhook on merge requests events."
    --enable_ssl_verification      "Do SSL verification when triggering the webhook."
    --confidential_issues_events   "Trigger webhook on confidential issues events. "
    --confidential_note_events     "Trigger webhook on confidential note events."

    --json|-j   "output json data"
'
    param:run
    local gen_gcode_json=""
    gen_gcode_json="$(param:option2json -repo)"
    ___x_cmd_gcode_param_init_owner_repo
    ___x_cmd_gcode_curl put "/projects/${owner_repo}/hooks/$1" "gen_gcode_json" | _____x_cmd_gcode_hook_ui_utils Edit
}

# EndSection

# Section: hook utils
_____x_cmd_gcode_hook_ui_utils(){
    if [ -n "$ENFORCE_JSON" ] || [ -n "$json" ]; then
        ___x_cmd_cmds_cat
        ___x_cmd_gcode_http_error
        return
    fi
    (
        case "$1" in
            Info)
                _inf_msg="Getting repo webhook info successfully"
                _err_msg="Getting repo webhook info failure"
                ;;
            Creating|Edit)
                _inf_msg="$1 repo webhook successfully"
                _err_msg="$1 repo webhook failure"
                ;;
        esac
        local _id=""
        x jo env . _id=.id gcode_resp_err=.error gcode_resp_msg=.message \
            url=.url push_events=.push_events
        if [ -n "$_id" ]; then
            ___x_cmd_ui_tf  true "${_inf_msg}:" "Id: $_id" ${push_events+"Push_Events: $push_events"} ${url+"URL: $url"}
        else
            ___x_cmd_ui_tf false "${_err_msg}:"
            ___x_cmd_gcode____handle_resp
            return 1
        fi
    )
}
# EndSection