#!/usr/bin/env bash
# build-n1-zone
#
# 自動化建置新 Zone 的 Game Servers 完整流程。
#
# 用法:
#   build-n1-zone <TimeZone> <Region Name> <Zone ID> <MS IP> <WS IP Init> <WS ID Start> <WS ID End> [DBNAME]
#
# 範例:
#   build-n1-zone +1 "EU (S32)" 32 10.8.73.12 10.8.73.121 3261 3299
#   build-n1-zone +9 "JP (S10)" 10 10.150.10.1 10.150.10.11 1001 1010 MyDB

set -euo pipefail

# ── 使用說明 ──────────────────────────────────────────────────────────────────
usage() {
    cat <<EOF
用法: $(basename "$0") <TimeZone> <Region Name> <Zone ID> <MS IP> <WS IP Init> <WS ID Start> <WS ID End> [DBNAME]

  TimeZone    時區偏移，e.g. +9 / +8 / +1 / -5
  Region Name 區域顯示名稱，e.g. "EU (S32)"
  Zone ID     Zone / Set ID，e.g. 32
  MS IP       MS/GDS/GAMEDB 使用的 IP
  WS IP Init  WS IP 起始，尾數依 WS ID 計算
  WS ID Start WS ID 起始（含）
  WS ID End   WS ID 結束（含）
  DBNAME      目標 DB 名稱（預設: WebTool）

範例:
  $(basename "$0") +1 "EU (S32)" 32 10.8.73.12 10.8.73.121 3261 3299
  $(basename "$0") +9 "JP (S10)" 10 10.150.10.1 10.150.10.11 1001 1010 MyDB
EOF
    exit 1
}

[[ $# -lt 7 ]] && usage

# ── 參數 ──────────────────────────────────────────────────────────────────────
TIMEZONE="$1"
REGION_NAME="$2"
ZONE_ID="$3"
MS_IP="$4"
WS_IP_INIT="$5"
WS_ID_START="$6"
WS_ID_END="$7"
DBNAME="${8:-WebTool}"

# ── Source .gamerc（暫時關閉嚴格模式，避免 .gamerc 內部指令觸發 set -e）──────
set +euo pipefail
source "$HOME/.gamerc"
set -euo pipefail

# ── 時間戳記（JST = UTC+9）────────────────────────────────────────────────────
TIMESTAMP=$(TZ=Asia/Tokyo date +"%Y%m%dT%H%M")
OUTPUT_FILENAME="s${ZONE_ID}_db_setup_${TIMESTAMP}.txt"
LOG_FILE="/tmp/build_new_game_servers-${ZONE_ID}_${WS_ID_START}_${WS_ID_END}_${TIMESTAMP}.log"

log() { echo "[$(date +%T)] $*"; }

# ── 全程 stdout/stderr tee 到 log 檔 ─────────────────────────────────────────
exec > >(tee -a "$LOG_FILE") 2>&1
log "=== build_new_game_servers 開始 ==="
log "  TimeZone:    ${TIMEZONE}"
log "  Region:      ${REGION_NAME}"
log "  Zone ID:     ${ZONE_ID}"
log "  MS IP:       ${MS_IP}"
log "  WS IP Init:  ${WS_IP_INIT}"
log "  WS ID 範圍:  ${WS_ID_START} ~ ${WS_ID_END}"
log "  DBNAME:      ${DBNAME}"
log "  Log:         ${LOG_FILE}"

# ── WS IP 計算（與 generate_hosts_n1_whole_new_zone 邏輯一致）─────────────────
calc_ws_ip() {
    local ws_ip_init="$1" ws_id="$2"
    local last_digit=$(( ws_id % 10 ))
    local offset=$(( (last_digit - 1 + 10) % 10 ))
    local prefix="${ws_ip_init%.*}"
    local last_octet="${ws_ip_init##*.}"
    echo "${prefix}.$((last_octet + offset))"
}

# 去重後收集本次所有 WS IP
collect_ws_ips() {
    declare -gA _seen=()
    WS_IPS=()
    local ws_id ip
    for ws_id in $(seq "$WS_ID_START" "$WS_ID_END"); do
        ip=$(calc_ws_ip "$WS_IP_INIT" "$ws_id")
        if [[ -z "${_seen[$ip]+_}" ]]; then
            _seen[$ip]=1
            WS_IPS+=("$ip")
        fi
    done
}

# ── Step 1: 確認 hosts 是否已有任何 WS 項目（執行前判斷）────────────────────
# Ctrl LIVEBuild（無參數）只有首次建置（hosts 完全沒有任何 WS）才使用。
# 只要 hosts 裡有任何 WS 存在（不論哪個 Zone），一律使用 nosync noreset。
HOSTS_FILE="$HOME/bin/hosts"
if grep -qP "(?<!\S)WS\d" "$HOSTS_FILE" 2>/dev/null; then
    HAS_EXISTING_WS=true
    log "hosts 已有 WS 項目 → 將使用 Ctrl LIVEBuild nosync noreset"
else
    HAS_EXISTING_WS=false
    log "hosts 無任何 WS 項目 → 將使用 Ctrl LIVEBuild（首次建置）"
fi

# ── Step 2: 更新 hosts ────────────────────────────────────────────────────────
log "執行 generate_hosts_n1_whole_new_zone..."
"$HOME/bin/generate_hosts_n1_whole_new_zone" \
    "$REGION_NAME" "$ZONE_ID" "$MS_IP" "$WS_IP_INIT" "$WS_ID_START" "$WS_ID_END"
log "generate_hosts_n1_whole_new_zone 完成"

log "執行 rewrite_etc_hosts..."
set +u
rewrite_etc_hosts
set -u
log "rewrite_etc_hosts 完成"

# ── Step 3: nosync noreset 模式 + 有新機器 → 先 rsync，再 Ctrl LIVEBuild ──────
if [[ "$HAS_EXISTING_WS" == true ]]; then
    collect_ws_ips
    log "對新機器執行 rsync（共 ${#WS_IPS[@]} 台）..."
    for ip in "${WS_IPS[@]}"; do
        log "  rsync → $ip"
        ssh "$ip" 'cd $HOME; rsync -avz CTRL:$HOME/common .'
    done
    log "rsync 完成"

    log "執行 Ctrl LIVEBuild nosync noreset..."
    "$HOME/bin/Ctrl" LIVEBuild nosync noreset
else
    log "執行 Ctrl LIVEBuild..."
    "$HOME/bin/Ctrl" LIVEBuild
fi
log "Ctrl LIVEBuild 完成"

# ── Step 4: generate_dbsetup → CTRL（tee 輸出到檔案）────────────────────────
log "執行 generate_dbsetup → CTRL:/tmp/${OUTPUT_FILENAME}..."
ssh CTRL '$HOME/bin/generate_dbsetup '"${TIMEZONE} ${ZONE_ID} ${WS_ID_START} ${WS_ID_END} | tee /tmp/${OUTPUT_FILENAME}"
log "generate_dbsetup 完成"

# ── Step 5: 確認 DB 是否存在，決定是否執行 psql 匯入 ─────────────────────────
if ssh CTRL "psql -U postgres -lqt | cut -d'|' -f1 | grep -qw '${DBNAME}'"; then
    log "DB '${DBNAME}' 存在，執行 psql 匯入..."
    ssh CTRL "psql -U postgres -d ${DBNAME} < /tmp/${OUTPUT_FILENAME}"
    log "psql 匯入完成"
else
    log "⚠️  DB '${DBNAME}' 不存在，已跳過 psql 匯入"
    log "    請手動執行匯入："
    log "    ssh CTRL 'psql -U postgres -d ${DBNAME} < /tmp/${OUTPUT_FILENAME}'"
fi

# ── 完成 ──────────────────────────────────────────────────────────────────────
echo ""
echo "======================================================"
echo " Zone ${ZONE_ID} 建置完成"
echo " DB:       ${DBNAME}"
echo " DB setup: CTRL:/tmp/${OUTPUT_FILENAME}"
echo " Log:      ${LOG_FILE}"
echo "======================================================"
log "=== build_new_game_servers 結束 ==="
