# shellcheck shell=sh disable=SC2154,SC2120,SC3043,SC2034

# Reference: https://discord.com/developers/docs/resources/webhook#execute-webhook


___x_cmd_discord_bot(){
    param:subcmd ___x_cmd_discord_bot    \
        send             "send msg"

    param:subcmd:try
    param:run

    if [ "$#" -eq 0 ]; then
        ___x_cmd_discord bot --help
    else
        ___x_cmd_discord bot send "$@"
    fi
    return
}

___x_cmd_discord_bot_send() {
    param:subcmd ___x_cmd_discord_bot_send        \
        --text            "send text"             \
        --file            "send file"             \
        --raw             "send raw json"         \
        --card            "send card"

    param:subcmd:try
    param:run

    if [ "$#" -eq 0 ]; then
        ___x_cmd_discord bot send --help
    else
        ___x_cmd_discord_bot_send_text "$@"
    fi
    return
}

___x_cmd_discord_bot_send_text() {
    param:scope             discord
    param:dsl <<A
option:
    #1              "provide text"                  <>
    --webhook       "webhook"                       <>=""
    --json|-j       "output origin json data"
A
    param:run
    local content="$1"
    res="$(___x_cmd_discord_bot___send_json <<A
{
    "content":"$content"
}
A
)" || return 1
    _____x_cmd_discord_ui_utils Text
}

___x_cmd_discord_bot_send_file() {
    param:scope             discord
    param:dsl <<A
option:
    --file_path     "provide file_path"             <>
    --webhook       "webhook"                       <>=""
    --json|-j       "output origin json data"
A
    param:run
    local res ; res="$(___x_cmd_discord_bot___send_file "$file_path" )" || return 1
    _____x_cmd_discord_ui_utils File
}

___x_cmd_discord_bot_send_raw() {
    param:scope             discord
    param:dsl <<A
option:
    #1              "Provide raw json"              <>
    --webhook       "webhook"                       <>=""
    --json|-j       "output origin json data"

A
    param:run
    local raw="${1}"; [ "$raw" != "-" ] || raw="$(___x_cmd_cmds_cat)"
    local res ; res="$(___x_cmd_discord_bot___send_json <<A
$raw
A
)" || return 1
    _____x_cmd_discord_ui_utils Raw
}

# https://birdie0.github.io/discord-webhooks-guide/structure/embed/image.html
    # --username              "provide bot name"                          <>=""
    # --avatar_url            "provide avatar url"                        <>=""
    # --content               "provide content"                           <>=""
___x_cmd_discord_bot_send_card() {
    param:scope             discord
    param:dsl <<A
option:
    --title                 "title of embed"                            <>=""
    --description           "provide description support markdown"      <>=""
    --url                   "url of embed"                              <>=""
    --timestamp             "timestamp of embed content"                <>=""
    --color                 "Set color for webhook embed"               <>=""
    --author_name           "provide author name"                       <>=""
    --author_url            "provide author url"                        <>=""
    --author_icon_url       "provide author avatar url"                 <>=""
    --fields|m              "Provide multiple fields in following format. [ <name> <value> ]"
                                                                        <>=""
                                                                        <>=""
    --thumbnail_url         "provide thumbnail url"                     <>=""
    --image_url             "provide image url"                         <>=""
    --footer_text           "provide footer text"                       <>=""
    --footer_icon_url       "Provide url of footer icon"                <>=""

    --webhook               "webhook"                                   <>=""
    --json|-j               "output origin json data"
A
    param:run
    local IFS="
"
    local all; local name ; local value
    for i in $(param_marg fields); do
        name="$(param_marg fields "$i" 1)"
        value="$(param_marg fields "$i" 2)"
        all="$all$(x jo dict "name:$name" "value:$value")"
    done

    local res ; res="$(___x_cmd_discord_bot___send_json <<A
{
  "username": "$username",
  "avatar_url": "$avatar_url",
  "content": "$content",
  "embeds": [
    {
      "author": {
        "name": "$author_name",
        "url": "$author_url",
        "icon_url": "$author_icon_url"
      },
      "title": "$title",
      "url": "$title_url",
      "description": "$description",
      "color": $color,
      "fields": [
            $(printf "%s" "$all" | x jo)
      ],
      "thumbnail": {
        "url": "$thumbnail_url"
      },
      "image": {
        "url": "$image_url"
      },
      "footer": {
        "text": "$footer_text",
        "icon_url": "$footer_icon_url"
      }
    }
  ]
}
A
)" || return 1
    _____x_cmd_discord_ui_utils card
}

_____x_cmd_discord_ui_utils(){
    if  [ -n "$json" ]; then
        printf "%s\n" "$res"
        return
    fi
    case "$1" in
        Text)
            msg="Sent text: $content  successfully"
            ;;
        Raw)
            msg="Sent message  successfully"
            ;;
        File)
            filename="$(printf "%s" "$res" | {  x jo env .attachments.1.filename ; echo "$filename" ; })"
            msg="Sent file:$filename  successfully"
            ;;
        card)
            msg="Sent card: $title  successfully"
            ;;
    esac
    local id ; id="$(printf "%s" "$res" | {  x jo env .id ; echo "$id" ; })"
    if [ -n "$id" ]; then
        ___x_cmd_ui_tf true "$msg"
    else
        ___x_cmd_ui_tf false "Failed to send message:" "ErrorMsg:$res"
    fi
}
