#!/usr/bin/env bash

# 使用方式：
#   ./merge_db_connect_verify /absolute/path/to/merge_setup.ini
#
# 流程：
#   1. source load_merge_db_setup
#   2. load_merge_db_setup <merge_setup.ini>
#   3. 依序檢查 AccountDB / GameDB / 所有 WorldDB（PostgreSQL）
#   4. 任何一個檢查失敗，整體 exit code = 1
#
# 依賴：
#   - load_merge_db_setup 內已實作：
#       load_merge_db_setup
#       check_accountdb_connection
#       check_gamedb_connection
#       check_worlddb_connection
#       並且 _db_pg_ping 回傳碼語意為：
#           0 = OK
#           2 = host/db/user 未設定完整
#           3 = 主機 / Port 無法連線
#           4 = DB 或認證錯誤
#           其他 = 未知錯誤

set -u

if [[ $# -lt 1 ]]; then
    echo "Usage: $0 /absolute/path/to/merge_setup.ini" >&2
    exit 1
fi

SETUP_FILE="$1"

# 強制要求絕對路徑，避免之後相對路徑混亂
if [[ "${SETUP_FILE:0:1}" != "/" ]]; then
    echo "請使用 setup 檔案的絕對路徑（目前：$SETUP_FILE）" >&2
    exit 1
fi

if [[ ! -f "$SETUP_FILE" ]]; then
    echo "找不到 setup 檔案：$SETUP_FILE" >&2
    exit 1
fi

# 取得目前腳本所在目錄，假設 load_merge_db_setup 跟這支在同一個目錄
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# 引入 load_merge_db_setup
# 若實際路徑不同，請自行調整
source "$SCRIPT_DIR/load_merge_db_setup"

# 載入設定
if ! load_merge_db_setup "$SETUP_FILE"; then
    echo "載入設定檔失敗：$SETUP_FILE" >&2
    exit 1
fi

echo "=== 檢查 PostgreSQL DB 連線：$SETUP_FILE ==="

overall_status=0

########################################
# 檢查 Account DB
########################################
echo "--- AccountDB ---"
if check_accountdb_connection; then
    echo "[OK]  AccountDB 連線正常"
else
    rc=$?
    case "$rc" in
        2)
            echo "[NG]  AccountDB 設定不完整（host/db/user 等必要欄位缺失）"
            ;;
        3)
            echo "[NG]  AccountDB 主機或 Port 無法連線（IP/Port/防火牆異常）"
            ;;
        4)
            echo "[NG]  AccountDB 認證失敗或 DB 名稱錯誤"
            ;;
        *)
            echo "[NG]  AccountDB 連線失敗（未知錯誤 rc=$rc）"
            ;;
    esac
    overall_status=1
fi
echo

########################################
# 檢查 Game DB
########################################
echo "--- GameDB ---"
if check_gamedb_connection; then
    echo "[OK]  GameDB 連線正常"
else
    rc=$?
    case "$rc" in
        2)
            echo "[NG]  GameDB 設定不完整（host/db/user 等必要欄位缺失）"
            ;;
        3)
            echo "[NG]  GameDB 主機或 Port 無法連線（IP/Port/防火牆異常）"
            ;;
        4)
            echo "[NG]  GameDB 認證失敗或 DB 名稱錯誤"
            ;;
        *)
            echo "[NG]  GameDB 連線失敗（未知錯誤 rc=$rc）"
            ;;
    esac
    overall_status=1
fi
echo

########################################
# 檢查所有 World DB
########################################
echo "--- WorldDB ---"
if [[ "${#world_ids[@]}" -gt 0 ]]; then
    # 排序 WorldID，便於閱讀
    mapfile -t sorted_world_ids < <(printf "%s\n" "${!world_ids[@]}" | sort -n)

    for wid in "${sorted_world_ids[@]}"; do
        if check_worlddb_connection "$wid"; then
            echo "[OK]  WorldDB($wid) 連線正常"
        else
            rc=$?
            case "$rc" in
                2)
                    echo "[NG]  WorldDB($wid) 設定不完整（host/db/user 等必要欄位缺失）"
                    ;;
                3)
                    echo "[NG]  WorldDB($wid) 主機或 Port 無法連線（IP/Port/防火牆異常）"
                    ;;
                4)
                    echo "[NG]  WorldDB($wid) 認證失敗或 DB 名稱錯誤"
                    ;;
                *)
                    echo "[NG]  WorldDB($wid) 連線失敗（未知錯誤 rc=$rc）"
                    ;;
            esac
            overall_status=1
        fi
    done
else
    echo "[INFO] 沒有任何 WorldDB 設定"
fi

echo "=== 檢查結束（PostgreSQL） ==="

exit "$overall_status"

