# shellcheck shell=sh
# shellcheck disable=SC2039,3043
___x_cmd_gh_org_membership(){
    param:scope  ___x_cmd_github
    param:subcmd ___x_cmd_gh_org_membership                     \
        ls                  "Interactive UI show org of user"   \
        ll                  "List membership"                   \
        info                "Get org membership user info"      \
        add                 "Add org membership"                \
        "edit|ed"           "Update org membership"             \
        rm                  "Remove membership"
    param:subcmd:try
    param:run

    ___x_cmd_gh_org_membership_ls
}

# Section: List
# shellcheck disable=SC2120
___x_cmd_gh_org_membership_ls(){
    if ___x_cmd_gx_has_format_args "$@"; then
        ___x_cmd_gh_org_membership_ll "$@"
        return
    fi
    param:scope     ___x_cmd_github
    param:dsl       '
options:
    --org           "org space address"                         <>:Address
    --filter        "Filter members returned in the list."      <>:OrgMemberFilter="all"
    --role          "Filter members returned by their role."    <>:OrgMemberRole="all"

    --per_page      "Results per page"                          <>:Number=30
    --page          "Page number of the results to fetch."      <>:Number=1
'
    param:run

    org="${org%%/*}"
    if ___x_cmd_gx_is_interactive_env; then
        local ___X_CMD_TUI_TABLE_FINAL_COMMAND
        local ___X_CMD_TUI_TABLE_CUR_LINE
        local ___X_CMD_TUI_TABLE_CUR_ITEM

        gh:info "List membership of [org=$org]"
        ___x_cmd_gh_tui_app --per_page "$per_page" --org "$org" --role "$role" --filter "$filter" --page "$page" \
            --request-code '___x_cmd_gh_get_multi "/orgs/${org}/members" role filter per_page page' \
            --error-msg "get membership list fail" \
            --end ___x_cmd_gh_org_membership_app_status_handler \
            "org.membership.app.awk"
    else
        ___x_cmd_gh_get_multi "/orgs/${org}/members" role filter | x jo 2c    .id
    fi

}
___x_cmd_gh_org_membership_app_status_handler(){
    if [ ! -t 1 ] || [ -n "$ENFORCE_JSON" ]; then
        ___x_cmd_gh_http_error
        return
    fi
    local user_name
    user_name="${___X_CMD_TUI_TABLE_CUR_LINE##*UserName: }"
    user_name=${user_name%%
Url:*}
    case "$___X_CMD_TUI_TABLE_FINAL_COMMAND" in
            "ENTER")        printf "%s\n" "$___X_CMD_TUI_TABLE_CUR_LINE"  ;;
            "c")            ___x_cmd_gh_org_membership_add    --org "${org}"                     ;;
            "u")            ___x_cmd_gh_org_membership_edit   --org "${org}"    "$user_name"     ;;
            "d")            ___x_cmd_gh_org_membership_rm     --org "${org}"    "$user_name"     ;;
            *)              return   ;;
    esac
}
# EndSection

# Section: List
# https://docs.github.com/en/rest/orgs/members#list-organization-members
___x_cmd_gh_org_membership_ll() {
    param:scope     ___x_cmd_github
    param:dsl       '
options:
    --org           "org space address"                         <>:Address
    --filter        "Filter members returned in the list."      <>:OrgMemberFilter="all"
    --role          "Filter members returned by their role."    <>:OrgMemberRole="all"

    --per_page      "Results per page"                          <>:Number=30
    --page          "Page number of the results to fetch."      <>:Number=1

    --json|-j       "output origin json data"
    --csv           "output csv data"
    --yml           "output yml data"
'
    param:run
    if ___x_cmd_gx_output_is_format; then
        ___x_cmd_gh_get_multi "/orgs/${org%%/*}/members" role filter | ___x_cmd_gx_output_format
    else
        ___x_cmd_gh_get_multi "/orgs/${org%%/*}/members" role filter | \
            x jo 2c             .id .login    .html_url | \
            x csv header --add   ID  UserName  Url      | \
            if [ -n "$csv" ]; then  ___x_cmd_cmds cat
            else                    x csv static_tab
            fi
    fi
}
# EndSection

# Section: Info
# https://docs.github.com/en/rest/orgs/members#get-organization-membership-for-a-user
___x_cmd_gh_org_membership_info() {
    param:scope     ___x_cmd_github
    param:dsl      <<A
options:
    #1                  "username address"          <>
    --org               "org space address"         <>:Address

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

    [ -n "$1" ] || M='accepts 1 arg (username), received empty' arg:ret:64
    local _avt_name="$1"
    ___x_cmd_gh____transform_avt_name || return
    ___x_cmd_gh_curl get "/orgs/${org%%/*}/memberships/${_avt_name##*/}" | ___x_cmd_gh_org_membership____ui_handler Info
}
# EndSection

# Section: Add
# https://docs.github.com/en/rest/orgs/members#set-organization-membership-for-a-user
___x_cmd_gh_org_membership_add() {
    param:scope     ___x_cmd_github
    param:dsl       <<A
type:
    role = admin member
options:
    --org           "org space address"                                 <>:Address
    --role          "The role to give the user in the organization"     <>:role="member"
    #1              "username"                                          <>

    --json|-j   "output json data"
A
    param:run
    [ "$#" -ne 0 ] || M='accepts arg(s) (username), received empty' arg:ret:64
    local _avt_name=""
    for _avt_name in "$@"; do
        ___x_cmd_gh____transform_avt_name || return
        ___x_cmd_gh_curl put  "/orgs/${org%%/*}/memberships/${_avt_name##*/}" -- role | ___x_cmd_gh_org_membership____ui_handler Add
    done
}
# EndSection

# Section: Edit
# https://docs.github.com/en/rest/orgs/members#set-organization-membership-for-a-user
___x_cmd_gh_org_membership_edit() {
    param:scope     ___x_cmd_github
    param:dsl       <<A
type:
    role = admin member
options:
    #1              "username"                                          <>:Username_multiple
    --org           "org space address"                                 <>:Address
    --role          "The role to give the user in the organization"     <>:role
    --json|-j       "output json data"
A
    param:run
    [ -n "$1" ] || M='accepts 1 arg (username), received empty' arg:ret:64
    local _avt_name="$1"
    ___x_cmd_gh____transform_avt_name || return
    ___x_cmd_gh_curl put  "/orgs/${org%%/*}/memberships/${_avt_name##*/}" -- role | ___x_cmd_gh_org_membership____ui_handler Edit
}
# EndSection

# Section: Remove
# https://docs.github.com/en/rest/orgs/members#remove-organization-membership-for-a-user
# shellcheck disable=SC2154
___x_cmd_gh_org_membership_rm() {
    param:scope     ___x_cmd_github
    param:dsl       <<A
options:
    --org       "org space address"                     <>:Address
    #1          "username"                              <>:Username_multiple
    --yes|-y    "Ignore remove prompt interception"
A
    param:run
    [ "$#" -ne 0 ] || M='accepts arg(s) (username), received empty' arg:ret:64
    local _avt_name=""
    for _avt_name in "$@"; do
        [ "$yes" = "true" ] || ___x_cmd_ui_yesno "Are you sure $org to remove user: $(___x_cmd_ui bold red "$_avt_name") ?" || continue
        ___x_cmd_gh_curl del "/orgs/${org%%/*}/members/${_avt_name##*/}" | (
                [ -z "$___X_CMD_GH_IN_TEST" ] || { ___x_cmd_cmds_cat; return; }
                x jo env . gh_resp_msg=.message gh_resp_err=.errors
                if ___x_cmd_gh_http_error; then
                    ___x_cmd_ui_tf  true "[Success]: Remove $_avt_name to organizations"
                else
                    ___x_cmd_ui_tf false "Remove $_avt_name to organizations failure:" >&2
                    ___x_cmd_gh____handle_resp
                    return 1
                fi
            )
    done
}
# EndSection

# Section: org membership UI
___x_cmd_gh_org_membership____ui_handler(){
    if  [ -n "$ENFORCE_JSON" ] || [ -n "$json" ]; then
        ___x_cmd_cmds_cat
        ___x_cmd_gh_http_error
        return
    fi
    (
        local state=""
        case "$1" in
            Info)
                x jo env . state=.state gh_resp_msg=.message gh_resp_err=.errors \
                    role=.role url=.organization_url name=.user.login
                _inf_msg="Getting membership in Membership in organizations information"
                _err_msg="Getting membership in organizations information failure"
                ;;
            Add|Edit)
                x jo env . state=.state gh_resp_msg=.message gh_resp_err=.errors
                _inf_msg="$1 $_avt_name to organizations successfully"
                _err_msg="$1 $_avt_name to organizations failure"
                ;;
        esac
        if [ -n "$state" ]; then
            ___x_cmd_ui_tf  true "${_inf_msg}:" ${name:+"Name: $name"}  ${role:+"Role: $role"} ${state:+"State: $state"} ${url:+"Url: $url"}
        else
            ___x_cmd_ui_tf false "${_err_msg}:" >&2
            ___x_cmd_gh____handle_resp
            return 1
        fi
    )
}
# EndSection