

# shellcheck shell=sh
# shellcheck disable=SC2039,3043
# http://localhost:4000/13.7/ee/api/members.html
___x_cmd_gcode_group_member(){
    param:subcmd ___x_cmd_gcode_group_member              \
        ls              "List member"                   \
        info            "Show groups member user info"  \
        add             "Add member"                    \
        "edit|ed"       "Update member"                 \
        rm              "Remove member"
    param:subcmd:try
    param:run

    ___x_cmd_gcode_group_member _param_help_doc
    return 1
}

# Section: List
# shellcheck disable=SC2154
# http://localhost:4000/13.7/ee/api/members.html#list-all-members-of-a-group-or-project
___x_cmd_gcode_group_member_ls(){
    param:scope     ___x_cmd_gcode
    param:dsl       '
options:
    --group|-g      "<group_path> or .id=<group_id>"                        <>
    --query         "A query string to search for members"                  <>=""
    --user_ids      "Filter the results on the given user IDs"              <>:integer_array=""

    --json|-j       "output json data"
'
    param:run
    [ -n "$group" ] || M='accepts option --group (<group_path> or .id=<group_id>), received empty' arg:ret:64
    local _avt_group="$group"
    ___x_cmd_gcode____transform_avt_group || return

    if [ -n "$json" ] || [ -n "$ENFORCE_JSON" ]; then
        ___x_cmd_gcode_get_multi "/groups/${_avt_group}/members" query user_ids
    else
        ___x_cmd_gcode_get_multi "/groups/${_avt_group}/members" query user_ids | \
            x jo 2c             .id .username .name .web_url .state | \
            x csv header --add   ID  Username  Name  URL      State | \
            x csv static_tab
    fi
}
# EndSection

# Section: Info
# shellcheck disable=SC2154
# http://localhost:4000/13.7/ee/api/members.html#get-a-member-of-a-group-or-project
___x_cmd_gcode_group_member_info(){
    param:scope     ___x_cmd_gcode
    param:dsl      '
options:
    #1                   "<user_path> or .id=<user_id>"                     <>:UserName
    --group|-g           "<group_path> or .id=<group_id>"                   <>
    --json|-j            "output json data"
'
    param:run
    [ -n "$1" ] || M='accepts arg (<user_path> or .id=<user_id>), received empty' arg:ret:64
    [ -n "$group" ] || M='accepts option --group (<group_path> or .id=<group_id>), received empty' arg:ret:64
    local _avt_name="$1"
    local _avt_group="$group"
    ___x_cmd_gcode____transform_avt_name  || return
    ___x_cmd_gcode____transform_avt_group || return
    ___x_cmd_gcode_curl get "/groups/${_avt_group}/members/${_avt_name}" | _____x_cmd_gcode_group_member_ui_utils User "$1"
}
# EndSection

# Section: Add
# shellcheck disable=SC2181,SC2034
# http://localhost:4000/13.7/ee/api/members.html#add-a-member-to-a-group-or-project
___x_cmd_gcode_group_member_add(){
    param:scope     ___x_cmd_gcode
    param:dsl       '
options:
    #1                      "<user_path> or .id=<user_id>"                                              <>:UserName
    --group|-g              "<group_path> or .id=<group_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 json data"
'
    param:run
    [ "$#" -ne 0 ] || M='accepts args (<user_path> or .id=<user_id>), received empty' arg:ret:64
    [ -n "$group" ] || M='accepts option --group (<group_path> or .id=<group_id>), received empty' arg:ret:64
    local _avt_group="$group"
    ___x_cmd_gcode____transform_avt_group || return

    ___x_cmd_gcode____transform_member_access
    local user_id="${___X_CMD_TX}"
    local gen_gcode_json
    gen_gcode_json="$(param:option2json -group +user_id)"

    local _avt_name=""
    for _avt_name in "$@"; do
        ___x_cmd_gcode____transform_avt_name || return
        gcode:debug "$(x tmpl "$gen_gcode_json"  "$_avt_name")"
        x tmpl "$gen_gcode_json" "$_avt_name" | ___x_cmd_gcode_curl post  "/groups/${_avt_group}/members" "@-" | _____x_cmd_gcode_group_member_ui_utils Add
    done
}
# EndSection

# Section: Edit
# http://localhost:4000/13.7/ee/api/members.html#edit-a-member-of-a-group-or-project
___x_cmd_gcode_group_member_edit(){
    param:scope     ___x_cmd_gcode
    param:dsl       '
options:
    #1                      "<user_path> or .id=<user_id>"                                              <>:UserName
    --group|-g              "<group_path> or .id=<group_id>"                                            <>
    --expires_at            "A date string in the format YEAR-MONTH-DAY"                                <>=""
    --access_level          "A valid access level"                                                      <>:Number = 10 20 30 40 50 guest reporter developer maintainer owner

    --json|-j               "output json data"
'
    param:run
    [ -n "$1" ] || M='accepts arg (<user_path> or .id=<user_id>), received empty' arg:ret:64
    [ -n "$group" ] || M='accepts option --group (<group_path> or .id=<group_id>), received empty' arg:ret:64
    local _avt_name="$1"
    local _avt_group="$group"
    ___x_cmd_gcode____transform_avt_name  || return
    ___x_cmd_gcode____transform_avt_group || return
    ___x_cmd_gcode____transform_member_access
    local gen_gcode_json
    gen_gcode_json="$(param:option2json -group)"
    gcode:debug "$gen_gcode_json"

    ___x_cmd_gcode_curl put "/groups/${_avt_group}/members/$_avt_name" "gen_gcode_json" | _____x_cmd_gcode_group_member_ui_utils Update
}
# EndSection

# Section: Remove
# shellcheck disable=SC2181,2154
# http://localhost:4000/13.7/ee/api/members.html#remove-a-member-from-a-group-or-project
___x_cmd_gcode_group_member_rm(){
    param:scope     ___x_cmd_gcode
    param:dsl       '
options:
    #1                      "<user_path> or .id=<user_id>"                  <>
    --group|-g              "<group_path> or .id=<group_id>"                <>
    --unassign_issuables    "Whether the removed member should be unassigned from any issues or merge requests inside a given group or project."

    --yes|-y                "Ignore remove prompt interception"
'
    param:run
    [ "$#" -ne 0 ] || M='accepts arg (<user_path> or .id=<user_id>), received empty' arg:ret:64
    [ -n "$group" ] || M='accepts option --group (<group_path> or .id=<group_id>), received empty' arg:ret:64
    [ -n "$unassign_issuables" ] || unassign_issuables=false
    local _avt_group="$group"
    ___x_cmd_gcode____transform_avt_group || return

    local _avt_name=""
    for _avt_name in "$@"; do
        ___x_cmd_gcode____transform_avt_name || return
        [ "$yes" = "true" ] || ___x_cmd_ui_yesno "Are you sure remove member of groups: $(___x_cmd_ui bold red "$_avt_name") ?" || continue
        ___x_cmd_gcode_curl del "/groups/${_avt_group}/members/${_avt_name}" -- unassign_issuables | (
            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 member $_avt_name"
            else
                ___x_cmd_ui_tf false "Remove member $_avt_name failure:"
                ___x_cmd_gcode____handle_resp
                return 1
            fi
        )
    done
}
# EndSection

# Section: UI Util
# shellcheck disable=2154
_____x_cmd_gcode_group_member_ui_utils(){
    if  [ -n "$ENFORCE_JSON" ] || [ -n "$json" ]; then
        ___x_cmd_cmds_cat
        ___x_cmd_gcode_http_error
        return
    fi
    (
        local _id=""
        case "$1" in
            User)
                x jo env . _id=.id gcode_resp_err=.error gcode_resp_msg=.message \
                    username=.username url=.web_url
                _inf_msg="Getting groups member info successfully"
                _err_msg="Getting groups member info failure"
                ;;
            Add|Update)
                x jo env . _id=.id gcode_resp_err=.error gcode_resp_msg=.message \
                    username=.username url=.web_url access_level=.access_level
                _inf_msg="$1 user of groups successfully"
                _err_msg="$1 user of groups failure"
                ;;
        esac
        if [ -n "$_id" ]; then
            ___x_cmd_ui_tf  true "${_inf_msg}:" "ID: $_id" ${username:+"Username: $username"} ${url:+"Url: $url"} ${access_level:+"Access_level: $access_level"}
        else
            ___x_cmd_ui_tf false "${_err_msg}:"
            ___x_cmd_gcode____handle_resp
            return 1
        fi
    )
}
# EndSection
