#!/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}"
    dbname=$(get_worlddb_value "${world_id}" "WorldDBName")
    dbname="${dbname}${POSTFIX_BEFORE}"
    dbip=$(get_worlddb_value "${world_id}" "WorldDBIP")
    dbuser=$(get_worlddb_value "${world_id}" "WorldDBUser")
    dbpass=$(get_worlddb_value "${world_id}" "WorldDBPassword")
    COUNT_1=$(ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U ${dbuser} ${dbname} -Atqc \"SELECT COUNT(*) FROM autosend_info;\"")
    COUNT_2=$(ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U ${dbuser} ${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}"
dbname=$(get_worlddb_value "${target_world_id}" "WorldDBName")
dbname="${dbname}${POSTFIX_AFTER}"
dbip=$(get_worlddb_value "${target_world_id}" "WorldDBIP")
dbuser=$(get_worlddb_value "${target_world_id}" "WorldDBUser")
dbpass=$(get_worlddb_value "${target_world_id}" "WorldDBPassword")
TOTAL_1=$(ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -Atqc \"SELECT COUNT(*) FROM autosend_info;\"")
TOTAL_2=$(ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" 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}"
dbname=$(get_worlddb_value "${target_world_id}" "WorldDBName")
dbname="${dbname}${POSTFIX_AFTER}"
dbip=$(get_worlddb_value "${target_world_id}" "WorldDBIP")
dbuser=$(get_worlddb_value "${target_world_id}" "WorldDBUser")
dbpass=$(get_worlddb_value "${target_world_id}" "WorldDBPassword")
TOTAL_1=$(ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -Atqc \"SELECT COUNT(*) FROM activity_wheel_broadcast;\"")
TOTAL_2=$(ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" 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}"
dbname=$(get_gamedb_value "GameDB")
dbname="${dbname}${POSTFIX_BEFORE}"
dbip=$(get_gamedb_value "GameDBIP")
dbuser=$(get_gamedb_value "GameDBUser")
dbpass=$(get_gamedb_value "GameDBPassword")
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT type, COUNT(*) FROM chat_group GROUP BY type ORDER BY type;\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" 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}"
dbname=$(get_gamedb_value "GameDB")
dbname="${dbname}${POSTFIX_AFTER}"
dbip=$(get_gamedb_value "GameDBIP")
dbuser=$(get_gamedb_value "GameDBUser")
dbpass=$(get_gamedb_value "GameDBPassword")
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT type, COUNT(*) FROM chat_group GROUP BY type ORDER BY type;\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" 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}"
dbname=$(get_gamedb_value "GameDB")
dbname="${dbname}${POSTFIX_BEFORE}"
dbip=$(get_gamedb_value "GameDBIP")
dbuser=$(get_gamedb_value "GameDBUser")
dbpass=$(get_gamedb_value "GameDBPassword")
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT world_id, COUNT(*) FROM player_characters GROUP BY world_id ORDER BY world_id;\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT COUNT(*) FROM player_characters WHERE world_id NOT IN (${target_world_id});\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" 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}"
dbname=$(get_gamedb_value "GameDB")
dbname="${dbname}${POSTFIX_AFTER}"
dbip=$(get_gamedb_value "GameDBIP")
dbuser=$(get_gamedb_value "GameDBUser")
dbpass=$(get_gamedb_value "GameDBPassword")
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT world_id, COUNT(*) FROM player_characters GROUP BY world_id ORDER BY world_id;\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT COUNT(*) FROM player_characters WHERE world_id NOT IN (${target_world_id});\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" 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}"
dbname=$(get_gamedb_value "GameDB")
dbname="${dbname}${POSTFIX_BEFORE}"
dbip=$(get_gamedb_value "GameDBIP")
dbuser=$(get_gamedb_value "GameDBUser")
dbpass=$(get_gamedb_value "GameDBPassword")
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT server_id, COUNT(*) FROM guild_info GROUP BY server_id ORDER BY server_id;\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT COUNT(*) FROM guild_info WHERE server_id NOT IN (${target_world_id});\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" 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}"
dbname=$(get_gamedb_value "GameDB")
dbname="${dbname}${POSTFIX_AFTER}"
dbip=$(get_gamedb_value "GameDBIP")
dbuser=$(get_gamedb_value "GameDBUser")
dbpass=$(get_gamedb_value "GameDBPassword")
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT server_id, COUNT(*) FROM guild_info GROUP BY server_id ORDER BY server_id;\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT COUNT(*) FROM guild_info WHERE server_id NOT IN (${target_world_id});\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" 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}"
dbname=$(get_gamedb_value "GameDB")
dbname="${dbname}${POSTFIX_BEFORE}"
dbip=$(get_gamedb_value "GameDBIP")
dbuser=$(get_gamedb_value "GameDBUser")
dbpass=$(get_gamedb_value "GameDBPassword")
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT COUNT(*) FROM player_characters;\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" 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}"
dbname=$(get_gamedb_value "GameDB")
dbname="${dbname}${POSTFIX_AFTER}"
dbip=$(get_gamedb_value "GameDBIP")
dbuser=$(get_gamedb_value "GameDBUser")
dbpass=$(get_gamedb_value "GameDBPassword")
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT COUNT(*) FROM player_characters;\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT COUNT(*) FROM player_characters WHERE (flag & 4 = 4);\""

# AccountDB > related tables ( PRE )
echo "AccountDB > related tables ( PRE )"
#dbname="${ACCOUNT_DB_NAME}${POSTFIX_BEFORE}"
dbname=$(get_accountdb_value "AccountDBName")
dbname="${dbname}${POSTFIX_BEFORE}"
dbip=$(get_accountdb_value "AccountDBIP")
dbuser=$(get_accountdb_value "AccountDBUser")
dbpass=$(get_accountdb_value "AccountDBPW")
START_WORLD_ID=$((${target_set_id} * 100))
END_WORLD_ID=$(((${target_set_id} + 1) * 100))
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT * FROM worlds WHERE id BETWEEN ${START_WORLD_ID} AND ${END_WORLD_ID} ORDER BY id;\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" 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 "AccountDB > related tables ( POST )"
#dbname="${ACCOUNT_DB_NAME}${POSTFIX_POST}"
dbname=$(get_accountdb_value "AccountDBName")
dbname="${dbname}${POSTFIX_AFTER}"
dbip=$(get_accountdb_value "AccountDBIP")
dbuser=$(get_accountdb_value "AccountDBUser")
dbpass=$(get_accountdb_value "AccountDBPW")
START_WORLD_ID=$((${target_set_id} * 100))
END_WORLD_ID=$(((${target_set_id} + 1) * 100))
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT * FROM worlds WHERE id BETWEEN ${START_WORLD_ID} AND ${END_WORLD_ID} ORDER BY id;\""
ssh -o StrictHostKeyChecking=no ${dbip} "PGPASSWORD=\"${dbpass}\" psql -U postgres ${dbname} -c \"SELECT * FROM fake_worlds WHERE id BETWEEN ${START_WORLD_ID} AND ${END_WORLD_ID} ORDER BY id;\""
