#!/bin/bash
#set -euo pipefail

source ~/.gamerc  # 確保載入 CHAT_WEBHOOK_URL 等變數
#GOOGLE_CHAT_WEBHOOK_URL="https://chat.googleapis.com/v1/spaces/AAAAhuJY4sw/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=WGx_HcQKapkR4Wf0U5cM19KoI43NwPVrPIbM8P3pPAo"

ACTION="${1:-}"
DATETIME="${2:-}"
PATCH_FTP_DIR_OVERRIDE="${3:-}"

# ===== 可清空的表白名單 =====
ALLOWED_TABLES=("cache_data" "temp_log" "player_sessions")

# ===== PATCH FTP 候選目錄（依優先順序，找到即停） =====
PATCH_FTP_DIR_CANDIDATES=(
    "${COUNTRY_CODE}_Unstable"
    "${COUNTRY_CODE}"
    "${COUNTRY_CODE}_STEAM"
)

is_allowed_table() {
    local input="$1"
    for table in "${ALLOWED_TABLES[@]}"; do
        if [[ "$table" == "$input" ]]; then
            return 0
        fi
    done
    return 1
}

# ===== Google Chat 卡片通知函式 =====
send_google_chat_card() {
    local title="$1"
    local body="$2"
    local emoji="${3:-ℹ️}"

    if [[ -z "${GOOGLE_CHAT_WEBHOOK_URL:-}" ]]; then
        echo "[WARN] CHAT_WEBHOOK_URL not set."
        return
    fi

    local payload=$(cat <<EOF
{
  "cards": [
    {
      "header": {
        "title": "$emoji $title",
        "subtitle": "系統通知",
        "imageUrl": "https://www.gstatic.com/images/icons/material/system/2x/info_black_48dp.png",
        "imageStyle": "IMAGE"
      },
      "sections": [
        {
          "widgets": [
            {
              "textParagraph": {
                "text": "$body"
              }
            }
          ]
        }
      ]
    }
  ]
}
EOF
)

    curl -s -X POST -H "Content-Type: application/json" \
        -d "$payload" \
        "$GOOGLE_CHAT_WEBHOOK_URL" >/dev/null
}

# ===== 功能定義 =====

restart_service() {
    echo "[INFO] Restarting service..."
    TestCtrl stop
    TestCtrl start
    send_google_chat_card "restart 通知" "✅ 測試雞重新啟動" "🔄"
}

fireall_service() {
    echo "[INFO] Change Firewall service..."
    yes | Ctrl LGAllow
#    send_google_chat_card "防火牆 通知" "✅ 開放玩家登入" "🔄"
}

truncate_table() {
    if [[ -z "$DATETIME" ]]; then
        echo "[ERROR] Table name is required."
        exit 1
    fi

    if [[ ! "$DATETIME" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then
        echo "[ERROR] Invalid table name format: '$DATETIME'"
        exit 1
    fi

    if ! is_allowed_table "$DATETIME"; then
        echo "[ERROR] Table '$DATETIME' is not in the allowed list."
        echo "[INFO] Allowed tables: ${ALLOWED_TABLES[*]}"
        exit 1
    fi

    echo "[INFO] Truncating table: $DATETIME"
    TestCtrl stop
    echo "truncate table $DATETIME;" | psql -U "postgres" -d "FFDB1"
    TestCtrl start

    send_google_chat_card "truncate_table 通知" "✅ 已清空表格：<b>$DATETIME</b>" "🧹"
}

find_patch_ftp_dir() {
    local datetime="$1"
    local dir result

    if [[ -n "$PATCH_FTP_DIR_OVERRIDE" ]]; then
        echo "$PATCH_FTP_DIR_OVERRIDE"
        return 0
    fi

    for dir in "${PATCH_FTP_DIR_CANDIDATES[@]}"; do
        result=$(lftp -e "ls; exit" "http://${REMOTE_PATCH_SERVER}/${dir}/${datetime}/" 2>/dev/null)
        if [[ -n "$result" ]]; then
            echo "$dir"
            return 0
        fi
    done

    return 1
}

apply_patch() {
    if [[ -z "$DATETIME" ]]; then
        echo "[ERROR] Patch datetime is required."
        exit 1
    fi

    local ftp_dir
    if [[ -n "$PATCH_FTP_DIR_OVERRIDE" ]]; then
        ftp_dir="$PATCH_FTP_DIR_OVERRIDE"
        echo "[INFO] Using specified FTP dir: $ftp_dir"
    else
        echo "[INFO] Probing FTP directories for patch: $DATETIME"
        ftp_dir=$(find_patch_ftp_dir "$DATETIME")
        if [[ -z "$ftp_dir" ]]; then
            echo "[ERROR] Patch '$DATETIME' not found in any FTP directory."
            echo "[INFO] Candidates tried: ${PATCH_FTP_DIR_CANDIDATES[*]}"
            exit 1
        fi
        echo "[INFO] Found patch in FTP dir: $ftp_dir"
    fi

    echo "[INFO] Downloading patch from ${REMOTE_PATCH_SERVER}/${ftp_dir}/${DATETIME} ..."
    lftp "http://${REMOTE_PATCH_SERVER}/${ftp_dir}/${DATETIME}" \
        -e "set mirror:parallel-transfer-count 5; mirror --parallel=5 . ~/patch/${DATETIME}; exit" \
        || { echo "[ERROR] Download failed, aborting patch."; exit 1; }

    echo "[INFO] Applying patch: $DATETIME"
    yes | TestCtrl patch TEST "$DATETIME" noftp

#    send_google_chat_card "PATCH 通知" "✅ PATCH 已套用：<b>$DATETIME</b>" "📦"
}

reload_itemmall_table() {
    if [[ -z "$DATETIME" ]]; then
        echo "[ERROR] Table name is required for reload_itemmall_table."
        exit 1
    fi

    echo "[INFO] Executing: yes | Ctrl itemmall $DATETIME"
    yes | Ctrl itemmall "$DATETIME"

    case "$DATETIME" in
        itemmall|fortune_bag|optional_fortune_bags)
            CMD="reload_itemmall_db"
            ;;
        bonus_activity_items|bonus_activity_mission|bonus_activity_gacha|bonus_activity_exchange|bonus_activity_alchemy|bonus_activity_game02|bonus_activity_gemspin1|bonus_activity_gemspin2|bonus_activity_pass01|bonus_activity_pass02|bonus_activity_spin1|bonus_activity_spin2)
            CMD="rnba"
            ;;
        iap)
            CMD="reload_iap_db"
            ;;
        lottery)
            CMD="reload_lottery_db"
            ;;
        dressroom)
            CMD="rdr"
            ;;
        consume_fortune_bag)
            CMD="reload_rebate_db"
            ;;
        payback)
            CMD="reload_payback_db"
            ;;
        advertisement_page)
            CMD="rad"
            ;;
        trendnews)
	    CMD="reload_trendnews_db"
	    ;;
        newbie_login_day)
            CMD="reload_newbie_event_db"
	    ;;
        *)
            echo "[ERROR] Unknown table '$DATETIME' for reload_itemmall_table."
            #send_google_chat_card "reload_itemmall_table 失敗" "❌ 未知的表名：<b>$DATETIME</b>" "❌"
            exit 1
            ;;
    esac

    echo "[INFO] Sending fastcgi command: $CMD"
#    send_fastcgi_once "$CMD"

#    send_google_chat_card "reload_itemmall_table 通知" "✅ 已重新載入：<b>$DATETIME</b> -> <code>$CMD</code>" "✅"
}

# ===== 主流程 =====

if [[ -z "$ACTION" ]]; then
    echo "Usage: $0 <restart|truncate|PATCH|reload_itemmall_table|lgallow> [TABLE|DATETIME] [PATCH_FTP_DIR]"
    exit 1
fi

case "$ACTION" in
    lgallow)
        fireall_service
	;;	
    restart)
        restart_service
        ;;
    truncate)
        truncate_table
        ;;
    PATCH)
        apply_patch
        ;;
    reload_itemmall_table)
        reload_itemmall_table
        ;;
    *)
        echo "[ERROR] Unknown action: $ACTION"
        echo "Usage: $0 <restart|truncate|PATCH|reload_itemmall_table|lgallow> [TABLE|DATETIME] [PATCH_FTP_DIR]"
        exit 1
        ;;
esac

