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

# gl repo member +el:admin -user-a +user-b
# shellcheck disable=SC2154,SC2086
___x_cmd_gl_repo_member(){
    param:subcmd ___x_cmd_gl_repo_member         \
        ls          "List repo member"           \
        info        "Show repo member user info" \
        add         "Add repo member"            \
        "edit|ed"   "Update repo member"         \
        rm          "Remove repo member"
    param:subcmd:try
    param:run

    ___x_cmd_gl_repo_member _param_help_doc

    return 1
}

# Section: List
# https://docs.gitlab.com/ee/api/members.html#list-all-members-of-a-group-or-project
___x_cmd_gl_repo_member_ls(){
    param:scope     ___x_cmd_gl
    param:dsl       '
options:
    --repo|-r           "<owner_path>/<repo_path> or .id=<repo_id>"                         <>
    --query             "Search for specific users"                                         <>=""
    --skip_users        "Filter out users with the specified ID"                            <>:integer_array=""
    --show_seat_info    "Show seat information for users"

    --page              "page"                                                              <>:Per_page="1"
    --per_page          "per_page"                                                          <>:Numbers="30"
    --json|-j           "output raw JSON data"
'
    param:run
    ___x_cmd_gl_param_init_owner_repo
    if [ -n "$json" ] || [ -n "$ENFORCE_JSON" ]; then
        ___x_cmd_gl_get_multi "/projects/$owner_repo/members" query skip_users
    else
        ___x_cmd_gl_get_multi "/projects/$owner_repo/members" query skip_users  |   \
            x jo 2c             .id .username .name  .state .access_level .web_url | \
            x csv awk -E '
            BEGIN{
                FS=","
            }
            {
            if($5 == 50) level = "owner" ;    if($5 == 40) level = "maintainer"
            if($5 == 30) level = "developer"; if($5 == 20) level = "reporter"
            if($5 == 10) level = "guest";     print $1","$2","$3","$4","level","$6
            } ' | \
            x csv header --add   ID  Username  Name   State  Access_level  URL     | \
            x csv static_tab
    fi
}
# EndSection

# Section: Info
# https://docs.gitlab.com/ee/api/members.html#get-a-member-of-a-group-or-project
___x_cmd_gl_repo_member_info(){
    param:scope     ___x_cmd_gl
    param:dsl      '
options:
    #1              "<user_path> or .id=<user_id>"                    <>
    --repo|-r       "<owner_path>/<repo_path> or .id=<repo_id>"       <>
    --json|-j       "output raw JSON data"
'
    param:run
    [ -n "$1" ] || M='accepts 1 arg (<user_path> or .id=<user_id>), received empty' arg:ret:64
    local _avt_name="$1"
    ___x_cmd_gl____transform_avt_name || return
    ___x_cmd_gl_param_init_owner_repo
    ___x_cmd_gl_curl get "/projects/$owner_repo/members/$_avt_name" | _____x_cmd_gl_repo_member_ui_utils Info
}
# EndSection

# Section: Add
# https://docs.gitlab.com/ee/api/members.html#add-a-member-to-a-group-or-project
# shellcheck disable=SC2034
___x_cmd_gl_repo_member_add(){
    param:scope     ___x_cmd_gl
    param:dsl       '
options:
    #1                  "<user_path> or .id=<user_id>"                                              <>
    --repo|-r           "<owner_path>/<repo_path> or .id=<repo_id>"                                 <>
    --access_level      "A valid access level"                                                      <>:Number = 10 20 30 40 50 guest reporter developer maintainer owner
    --expires_at        "A date string in the format YEAR-MONTH-DAY"                                <>=""
    --invite_source     "The source of the invitation that starts the member creation process"      <>=""
    --tasks_to_be_done  "Tasks the inviter wants the member to focus on"                            <>=""
    --tasks_repo_id     "The project ID in which to create the task issues"                         <>=""
    --json|-j           "output raw JSON data"
'
    param:run
    [ "$#" -ne 0 ] || M='accepts args (<user_path> or .id=<user_id>), received empty' arg:ret:64
    ___x_cmd_gl_param_init_owner_repo
    ___x_cmd_gl____transform_member_access

    local user_id="${___X_CMD_TX}"
    local gen_gl_json
    gen_gl_json="$(param:option2json -repo +user_id)"

    local _avt_name=""
    for _avt_name in "$@"; do
        ___x_cmd_gl____transform_avt_name || return
        gl:debug "$(x tmpl "$gen_gl_json"  "$_avt_name")"
        x tmpl "$gen_gl_json"  "$_avt_name" | ___x_cmd_gl_curl post "/projects/$owner_repo/members" "@-" | _____x_cmd_gl_repo_member_ui_utils Creating
    done
}
# EndSection

# Section: Edit
# https://docs.gitlab.com/ee/api/members.html#edit-a-member-of-a-group-or-project
___x_cmd_gl_repo_member_edit(){
    param:scope     ___x_cmd_gl
    param:dsl       '
options:
    #1                  "<user_path> or .id=<user_id>"                                      <>
    --repo|-r           "<owner_path>/<repo_path> or .id=<repo_id>"                         <>
    --access_level      "A valid access level"                                              <>:Number = 10 20 30 40 50 guest reporter developer maintainer owner
    --expires_at        "A date string in the format YEAR-MONTH-DAY"                        <>=""
    --json|-j           "output raw JSON data"
'
    param:run
    [ -n "$1" ] || M='accepts arg (<user_path> or .id=<user_id>), received empty' arg:ret:64
    local _avt_name="$1"
    ___x_cmd_gl____transform_avt_name || return

    ___x_cmd_gl____transform_member_access
    local gen_gl_json
    gen_gl_json="$(param:option2json -repo)"
    gl:debug "$gen_gl_json"

    ___x_cmd_gl_param_init_owner_repo
    ___x_cmd_gl_curl put "/projects/${owner_repo}/members/${_avt_name}" "gen_gl_json" | _____x_cmd_gl_repo_member_ui_utils Update
}
# EndSection

# Section: Remove
# https://docs.gitlab.com/ee/api/members.html#remove-a-member-from-a-group-or-project
___x_cmd_gl_repo_member_rm(){
    param:scope     ___x_cmd_gl
    param:dsl       '
options:
    #1                      "<user_path> or .id=<user_id>"                                      <>
    --repo|-r               "<owner_path>/<repo_path> or .id=<repo_id>"                         <>
    --unassign_issuables    "unassign issuables"
    --yes|-y                "Ignore remove prompt interception"

'
    param:run
    [ "$#" -ne 0 ] || M='accepts args (<user_path> or .id=<user_id>), received empty' arg:ret:64
    [ -n "$unassign_issuables" ] || unassign_issuables=false
    ___x_cmd_gl_param_init_owner_repo

    local _avt_name=""
    for _avt_name in "$@"; do
        ___x_cmd_gl____transform_avt_name || return
        [ "$yes" = "true" ] || ___x_cmd_ui_yesno "Are you sure you want to remove member : $(___x_cmd_ui bold red "$_avt_name") ?" || continue
        ___x_cmd_gl_curl del "/projects/$owner_repo/members/$_avt_name" | (
            x jo env . gl_resp_err=.message
            if  ___x_cmd_gl_http_error; then
                ___x_cmd_ui_tf true "[Success]: Remove $_avt_name of $repo"
            else
                ___x_cmd_ui_tf false "Remove $_avt_name of $repo failure:"
                ___x_cmd_gl____handle_resp
                return 1
            fi
        )
    done
}
# EndSection

# Section: repo member utils
_____x_cmd_gl_repo_member_ui_utils(){
    if [ -n "$ENFORCE_JSON" ] || [ -n "$json" ]; then
        ___x_cmd_cmds_cat
        ___x_cmd_gl_http_error
        return
    fi
    (
        case "$1" in
            Info)
                _inf_msg="Getting repo member information successfully"
                _err_msg="Getting repo member information failure"
                ;;
            Update)
                _inf_msg="Update repo member information successfully"
                _err_msg="Update repo member information failure"
                ;;
            Creating)
                _inf_msg="Add user to $repo repo successfully"
                _err_msg="Add user to $repo repo failure"
                ;;
        esac
        local _id=""
        x jo env . _id=.id gl_resp_err=.error gl_resp_msg=.message \
            username=.username name=.name web_url=.web_url state=.state access_level=.access_level
        if [ -n "$_id" ]; then
            ___x_cmd_ui_tf  true "${_inf_msg}:" "User_ID: $_id" ${name:+"Name: $name"} ${username:+"Username: $username"} \
                ${state:+"State: $state"} ${access_level:+"Access_level: $access_level"} ${url:+"Url: $url"}
        else
            ___x_cmd_ui_tf false "${_err_msg}:"
            ___x_cmd_gl____handle_resp
            return 1
        fi
    )
}
# EndSection