

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

___x_cmd_gt_org_membership(){
    param:subcmd ___x_cmd_gt_org_membership     \
        ls              "Interactive UI show org of user"   \
        ll              "List   org membership"             \
        info            "Show   org membership user info"   \
        "edit|ed"       "Update org membership role"        \
        add             "Add    org membership"             \
        rm              "Remove org membership"
    param:subcmd:try
    param:run

    ___x_cmd_gt_org_membership_ls
}

# Section: List
# shellcheck disable=SC2120
___x_cmd_gt_org_membership_ls(){
    if ___x_cmd_gx_has_format_args "$@"; then
        ___x_cmd_gt_org_membership_ll "$@"
        return
    fi

    param:scope     ___x_cmd_gt
    param:dsl       '
    options:
    --org           "org space address"              <>:Address
    --role          "role"                           <>:UserRole="all"
    --page          "page"                           <>="1"
    --per_page      "per_page"                       <>="30"
'
    param:run



    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

        ___x_cmd_gt_tui_app --org "$org" --role "$role" --page "$page" --per_page "$per_page" \
            --request-code '___x_cmd_gt_get_multi "/orgs/${org##*/}/members" role' \
            --error-msg "Couldn't find any data by $org" \
            --end ___x_cmd_gt_org_membership_app_status_handler \
            "org.membership.app.awk"
    else
        ___x_cmd_gt_get_multi "/orgs/${org##*/}/members" role | \
           x jo 2c  .login
    fi

}
___x_cmd_gt_org_membership_app_status_handler(){
    if [ ! -t 1 ] || [ -n "$ENFORCE_JSON" ]; then
        ___x_cmd_gt_http_error
        return
    fi
    local user_name
    user_name="${___X_CMD_TUI_TABLE_CUR_LINE##*NameSpace: }"
    user_name=${user_name%%
NAME:*}

    case "$___X_CMD_TUI_TABLE_FINAL_COMMAND" in
            "ENTER")        printf "%s\n" "$___X_CMD_TUI_TABLE_FINAL_COMMAND"  ;;
            "c")            ___x_cmd_gt_org_membership_add    --org "${org##*/}"                        ;;
            "u")            ___x_cmd_gt_org_membership_edit   --org "${org##*/}"    "$user_name"        ;;
            "d")            ___x_cmd_gt_org_membership_rm     --org "${org##*/}"    "$user_name"        ;;
            *)              return   ;;
    esac
}
# EndSection

# Section: List

# shellcheck disable=SC2154
# https://gitee.com/api/v5/swagger#/getV5OrgsOrgMembers
___x_cmd_gt_org_membership_ll(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    --org           "org space address"              <>:Address
    --role          "role"                           <>:UserRole="all"
    --page          "page"                           <>="1"
    --per_page      "per_page"                       <>="30"

    --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_gt_get_multi "/orgs/${org##*/}/members" role | ___x_cmd_gx_output_format
    else
        ___x_cmd_gt_get_multi "/orgs/${org##*/}/members" role | \
            x jo 2c            .login     .name .member_role .html_url | \
            x csv header --add  NameSpace  Name  Role         Url      | \
            if [ -n "$csv" ]; then  ___x_cmd_cmds cat
            else                    x csv static_tab
            fi
    fi
}

# EndSection

# Section: Info
# shellcheck disable=SC2154
# https://gitee.com/api/v5/swagger#/getV5OrgsOrgMembershipsUsername
___x_cmd_gt_org_membership_info(){
    param:scope     ___x_cmd_gt
    param:dsl      '
options:
    #1              "username: user space address"   <>:UserName
    --org           "org space address"              <>:Address
    --json|-j       "output origin json data"
'
    param:run
    local _avt_name="$1"
    ___x_cmd_gt____transform_avt_name || return
    ___x_cmd_gt_curl get "/orgs/${org##*/}/memberships/${_avt_name##*/}" | ___x_cmd_gt_org_membership____ui_handler Info
}
# EndSection

# Section: Add

# shellcheck disable=SC2181
# https://gitee.com/api/v5/swagger#/putV5OrgsOrgMembershipsUsername
___x_cmd_gt_org_membership_add(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1              "user login name"            <>:UserName
    --org           "org space address"          <>:Address
    --role          "user role"                  <>:OrganizationsAccess=member
    --json|-j       "output origin json data"
'
    param:run

    local _avt_name=""
    for _avt_name in "$@"; do
        ___x_cmd_gt____transform_avt_name || return
        ___x_cmd_gt_curl put "/orgs/${org##*/}/memberships/${_avt_name##*/}" -- role | \
            ___x_cmd_gt_org_membership____ui_handler Add
    done
}
# EndSection

# Section: Edit

# shellcheck disable=SC2181
# https://gitee.com/api/v5/swagger#/putV5OrgsOrgMembershipsUsername
___x_cmd_gt_org_membership_edit(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1              "user login name"            <>:UserName
    --org           "org space address"          <>:Address
    --role          "user role"                  <>:OrganizationsAccess=member
    --json|-j       "output origin json data"
'
    param:run

    ___x_cmd_gt_org_membership_add --org "$org" --role "$role" "$@"
}

# EndSection

# Section: Remove
# shellcheck disable=SC2181,SC2154,SC2034
# https://gitee.com/api/v5/swagger#/deleteV5OrgsOrgMembershipsUsername
___x_cmd_gt_org_membership_rm(){
    param:scope     ___x_cmd_gt
    param:dsl       '
options:
    #1          "user login name"                       <>:UserName
    --org       "org space address"                     <>:Address
    --yes|-y    "Ignore remove prompt interception"
'
    param:run

    local _avt_name=""
    local _exit_code=0
    for _avt_name in "$@"; do
        ___x_cmd_gt____transform_avt_name || return
        [ "$yes" = "true" ] || ___x_cmd_ui_yesno "Are you sure $org to remove user: $(___x_cmd_ui bold red "$_avt_name") ?" || continue
        ___x_cmd_gt_curl del "/orgs/${org##*/}/memberships/${_avt_name##*/}" | (
            [ -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 $_avt_name on $org"
            else
                ___x_cmd_ui_tf false "Remove $_avt_name on $org failure:" >&2
                ___x_cmd_gt____handle_resp
                return 1
            fi
        )
    done
    return "$_exit_code"
}

# EndSection

# Section: org membership UI
___x_cmd_gt_org_membership____ui_handler(){
    if [ -n "$ENFORCE_JSON" ] || [ -n "$json" ]; then
        ___x_cmd_cmds_cat
        ___x_cmd_gt_http_error
        return
    fi
    (
        case "$1" in
            Add)
                _inf_msg="Resolve $_avt_name member on $org successfully"
                _err_msg="Resolve $_avt_name member on $org failure"
            ;;
            Info)
                _inf_msg="$org $_avt_name member information"
                _err_msg="No find any $org organization member data by $_avt_name"
            ;;
        esac
        local _url=""
        x jo env . _url=.url gt_resp_err=.message gt_resp_err=.error \
            organization=.organization.name name=.user.name name_space=.user.login role=.role html_url=.user.html_url
        if [ -n "$_url" ]; then
            ___x_cmd_ui_tf  true "${_inf_msg}:" ${organization:+"Organization: $organization"} ${name:+"Name: $name"} \
                ${name_space:+"NameSpace: $name_space"} ${role:+"Role: $role"} ${html_url:+"URL: $html_url"}
        else
            ___x_cmd_ui_tf false "${_err_msg}:" >&2
            ___x_cmd_gt____handle_resp
            return 1
        fi
    )
}
# EndSection

