#!/usr/bin/env bash

[ "$3" == "" ] && exec echo "Usage: $0 <absolute path for the merge_setup.ini> <postfix for the db before merge> <postfix for the db after merge>"

MERGE_SETUP_INI=$1
POSTFIX_BEFORE=$2
POSTFIX_AFTER=$3

# 指向你的設定檔
SETUP_FILE=${MERGE_SETUP_INI}

source $HOME/.gamerc

# 載入解析 library
source "$HOME/bin/load_merge_db_setup"

# 讀取設定檔，建立 Account/Game/World 陣列
load_merge_db_setup "$SETUP_FILE" || exit 1

echo "=== Account DB ==="
echo "IP:       ${account[AccountDBIP]}"
echo "Name:     ${account[AccountDBName]}"
echo "User:     ${account[AccountDBUser]}"
echo "Password: ${account[AccountDBPW]}"

echo
echo "=== Game DB ==="
echo "IP:       ${game[GameDBIP]}"
echo "DB:       ${game[GameDB]}"
echo "User:     ${game[GameDBUser]}"
echo "Password: ${game[GameDBPassword]}"

#echo
#echo "=== World 列表 ==="
#echo "All WorldIDs: ${!world_ids[@]}"
#sorted_world_ids=($(printf "%s\n" "${!world_ids[@]}" | sort))
#echo "All WorldIDs: ${sorted_world_ids[*]}"

# 範例：依 WorldID 取一組 World DB 資訊
#wid=1002
#
#echo
#echo "=== World $wid ==="
#eval 'echo "WorldID:        ${world_'$wid'[WorldID]}"'
#eval 'echo "World DB IP:    ${world_'$wid'[WorldDBIP]}"'
#eval 'echo "World DB Name:  ${world_'$wid'[WorldDBName]}"'
#eval 'echo "World DB User:  ${world_'$wid'[WorldDBUser]}"'
#eval 'echo "World DB Pass:  ${world_'$wid'[WorldDBPassword]}"'

# 如果要做 target / source 分類（第一組是 target，其餘是 source）
#echo
sorted_world_ids=($(printf "%s\n" "${!world_ids[@]}" | sort))
target_world_id="${sorted_world_ids[0]}"
target_set_id=$((target_world_id / 100))
source_world_ids=("${sorted_world_ids[@]:1}")

for wid in ${source_world_ids[*]}; do
    echo
    echo "=== World $wid ==="
    eval 'echo "WorldID:        ${world_'$wid'[WorldID]}"'
    eval 'echo "World DB IP:    ${world_'$wid'[WorldDBIP]}"'
    eval 'echo "World DB Name:  ${world_'$wid'[WorldDBName]}"'
    eval 'echo "World DB User:  ${world_'$wid'[WorldDBUser]}"'
    eval 'echo "World DB Pass:  ${world_'$wid'[WorldDBPassword]}"'
done

echo
echo "=== World 列表 ==="
echo "All WorldIDs: ${!world_ids[@]}"
echo "Target world: $target_world_id"
echo "Source worlds: ${source_world_ids[*]}"

# WorldDB > autosend_info & redenvelope_info 筆數確認 ( PRE )
TOTAL_1=0; TOTAL_2=0
echo
echo "1a. WorldDB > autosend_info & redenvelope_info ( PRE )"
for world_id in ${sorted_world_ids[*]}; do
    dbname="${WORLD_DB_NAME}${world_id}${POSTFIX_BEFORE}"
    COUNT_1=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM autosend_info;")
    COUNT_2=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM redenvelope_info;"); TOTAL_1=$((TOTAL_1 + COUNT_1))
    TOTAL_2=$((TOTAL_2 + COUNT_2))
    echo "${dbname}, ${COUNT_1}, ${TOTAL_1}, ${COUNT_2}, ${TOTAL_2}"
done 
echo

# WorldDB > autosend_info & redenvelope_info 筆數確認 ( POST )
echo "1b. WorldDB > autosend_info & redenvelope_info ( POST )"
dbname="${WORLD_DB_NAME}${target_world_id}${POSTFIX_AFTER}"
TOTAL_1=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM autosend_info;")
TOTAL_2=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM redenvelope_info;")
echo "${dbname}, ${TOTAL_1}, ${TOTAL_2}"
echo

# WorldDB > 清空 target db > activity_wheel_broadcast 跟 activity_minigame_wheel_broadcast ( POST )
echo "2. WorldDB > 清空 target db > activity_wheel_broadcast 跟 activity_minigame_wheel_broadcast ( POST )"
dbname="${WORLD_DB_NAME}${target_world_id}${POSTFIX_AFTER}"
TOTAL_1=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM activity_wheel_broadcast;")
TOTAL_2=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM activity_minigame_wheel_broadcast;")
echo "${dbname}, ${TOTAL_1}, ${TOTAL_2}"
echo

# GameDB > chat_group (type=0 or type=2) 資料都砍掉 ( PRE )
echo "3a. GameDB > chat_group (type=0 or type=2) 資料都砍掉 ( PRE )"
dbname="${GAME_DB_NAME}${target_set_id}${POSTFIX_BEFORE}"
psql -U postgres ${dbname} -c "SELECT type, COUNT(*) FROM chat_group GROUP BY type ORDER BY type;"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM chat_group WHERE type IN (0, 2);"

# GameDB > chat_group (type=0 or type=2) 資料都砍掉 ( POST )
echo "3b. GameDB > chat_group (type=0 or type=2) 資料都砍掉 ( POST )"
dbname="${GAME_DB_NAME}${target_set_id}${POSTFIX_AFTER}"
psql -U postgres ${dbname} -c "SELECT type, COUNT(*) FROM chat_group GROUP BY type ORDER BY type;"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM chat_group WHERE type IN (0, 2);"

# GameDB > player_characters::world_id ( PRE )
echo "4a. GameDB > player_characters::world_id ( PRE )"
dbname="${GAME_DB_NAME}${target_set_id}${POSTFIX_BEFORE}"
psql -U postgres ${dbname} -c "SELECT world_id, COUNT(*) FROM player_characters GROUP BY world_id ORDER BY world_id;"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM player_characters WHERE world_id NOT IN (${target_world_id});"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM player_characters;"

# GameDB > player_characters::world_id ( POST )
echo "4b. GameDB > player_characters::world_id ( POST )"
dbname="${GAME_DB_NAME}${target_set_id}${POSTFIX_AFTER}"
psql -U postgres ${dbname} -c "SELECT world_id, COUNT(*) FROM player_characters GROUP BY world_id ORDER BY world_id;"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM player_characters WHERE world_id NOT IN (${target_world_id});"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM player_characters;"

# GameDB > guild_info::server_id ( PRE )
echo "5a. GameDB > guild_info::server_id ( PRE )"
dbname="${GAME_DB_NAME}${target_set_id}${POSTFIX_BEFORE}"
psql -U postgres ${dbname} -c "SELECT server_id, COUNT(*) FROM guild_info GROUP BY server_id ORDER BY server_id;"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM guild_info WHERE server_id NOT IN (${target_world_id});"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM guild_info;"

# GameDB > guild_info::server_id ( POST )
echo "5b. GameDB > guild_info::server_id ( POST )"
dbname="${GAME_DB_NAME}${target_set_id}${POSTFIX_AFTER}"
psql -U postgres ${dbname} -c "SELECT server_id, COUNT(*) FROM guild_info GROUP BY server_id ORDER BY server_id;"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM guild_info WHERE server_id NOT IN (${target_world_id});"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM guild_info;"

# GameDB > player_characters::flag & 4 = 4 更名 ( PRE )
echo "6a. GameDB > player_characters::flag & 4 = 4 更名 ( PRE )"
dbname="${GAME_DB_NAME}${target_set_id}${POSTFIX_BEFORE}"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM player_characters;"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM player_characters WHERE (flag & 4 = 4);"

# GameDB > player_characters::flag & 4 = 4 更名 ( POST )
echo "6b. GameDB > player_characters::flag & 4 = 4 更名 ( POST )"
dbname="${GAME_DB_NAME}${target_set_id}${POSTFIX_AFTER}"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM player_characters;"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM player_characters WHERE (flag & 4 = 4);"

# AccountDB > related tables ( PRE )
echo "7a. AccountDB > related tables ( PRE )"
dbname="${ACCOUNT_DB_NAME}${POSTFIX_BEFORE}"
START_WORLD_ID=$((${target_set_id} * 100))
END_WORLD_ID=$(((${target_set_id} + 1) * 100))
ssh ${account[AccountDBIP]} "psql -U postgres ${dbname} -c \"SELECT * FROM worlds WHERE id BETWEEN ${START_WORLD_ID} AND ${END_WORLD_ID} ORDER BY id;\""
ssh ${account[AccountDBIP]} "psql -U postgres ${dbname} -c \"SELECT * FROM fake_worlds WHERE id BETWEEN ${START_WORLD_ID} AND ${END_WORLD_ID} ORDER BY id;\""

# AccountDB > related tables ( POST )
echo "7b. AccountDB > related tables ( POST )"
dbname="${ACCOUNT_DB_NAME}${POSTFIX_POST}"
START_WORLD_ID=$((${target_set_id} * 100))
END_WORLD_ID=$(((${target_set_id} + 1) * 100))
ssh ${account[AccountDBIP]} "psql -U postgres ${dbname} -c \"SELECT * FROM worlds WHERE id BETWEEN ${START_WORLD_ID} AND ${END_WORLD_ID} ORDER BY id;\""
ssh ${account[AccountDBIP]} "psql -U postgres ${dbname} -c \"SELECT * FROM fake_worlds WHERE id BETWEEN ${START_WORLD_ID} AND ${END_WORLD_ID} ORDER BY id;\""
