#!/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[*]}"
#IFS=',' read -r sorted_world_ids_str <<< "${sorted_world_ids[*]}"
#IFS=',' read -r source_world_ids_str <<< "${source_world_ids[*]}"
sorted_world_ids_str=$(join_by_comma "${sorted_world_ids[@]}")
source_world_ids_str=$(join_by_comma "${source_world_ids[@]}")
echo "sorted_world_ids_str => ${sorted_world_ids_str}"
echo "source_world_ids_str => ${source_world_ids_str}"

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

# WorldDB > autosend_info & redenvelope_info 筆數確認 ( POST )
echo "1. WorldDB > autosend_info & redenvelope_info ( POST )"
dbname="${WORLD_DB_NAME}${target_world_id}${POSTFIX_AFTER}"
TOTAL_1_autosend_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM autosend_info;")
TOTAL_1_redenvelope_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM redenvelope_info;")
echo "${dbname}, ${TOTAL_1_autosend_post}, ${TOTAL_1_redenvelope_post}"
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_2_activity_wheel_broadcast=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM activity_wheel_broadcast;")
TOTAL_2_activity_minigame_wheel_broadcast=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM activity_minigame_wheel_broadcast;")
echo "${dbname}, ${TOTAL_2_activity_wheel_broadcast}, ${TOTAL_2_activity_minigame_wheel_broadcast}"
echo

# GameDB > chat_group (type=0 or type=2) 資料都砍掉 ( PRE )
echo "3. 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);"
TOTAL_3_chat_group_0_2_pre=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM chat_group WHERE type IN (0, 2);")
echo "${dbname}, ${TOTAL_3_chat_group_0_2_pre}"
echo

# GameDB > chat_group (type=0 or type=2) 資料都砍掉 ( POST )
echo "3. 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);"
TOTAL_3_chat_group_0_2_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM chat_group WHERE type IN (0, 2);")
echo "${dbname}, ${TOTAL_3_chat_group_0_2_post}"
echo

# GameDB > player_characters::world_id ( PRE )
echo "4. 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 WHERE world_id IN (${sorted_world_ids_str}) GROUP BY world_id ORDER BY world_id;"
TOTAL_4_pcs_target_wid_pre=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${target_world_id});")
TOTAL_4_pcs_source_wids_pre=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${source_world_ids_str});")
TOTAL_4_pcs_merge_wids_pre=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${sorted_world_ids_str});")
echo "${dbname}, ${TOTAL_4_pcs_target_wid_pre}, ${TOTAL_4_pcs_source_wids_pre}, ${TOTAL_4_pcs_merge_wids_pre}"
echo

# GameDB > player_characters::world_id ( POST )
echo "4. 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 WHERE world_id IN (${sorted_world_ids_str}) GROUP BY world_id ORDER BY world_id;"
TOTAL_4_pcs_target_wid_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${target_world_id});")
TOTAL_4_pcs_source_wids_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${source_world_ids_str});")
TOTAL_4_pcs_merge_wids_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${sorted_world_ids_str});")
echo "${dbname}, ${TOTAL_4_pcs_target_wid_post}, ${TOTAL_4_pcs_source_wids_post}, ${TOTAL_4_pcs_merge_wids_post}"
echo

# GameDB > guild_info::server_id ( PRE )
echo "5. 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;"
TOTAL_5_guild_target_wid_pre=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM guild_info WHERE server_id IN (${target_world_id});")
TOTAL_5_guild_source_wids_pre=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM guild_info WHERE server_id IN (${source_world_ids_str});")
TOTAL_5_guild_merge_wids_pre=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM guild_info WHERE server_id IN (${sorted_world_ids_str});")
echo "${dbname}, ${TOTAL_5_guild_target_wid_pre}, ${TOTAL_5_guild_source_wids_pre}, ${TOTAL_5_guild_merge_wids_pre}"
echo

# GameDB > guild_info::server_id ( POST )
echo "5. 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;"
TOTAL_5_guild_target_wid_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM guild_info WHERE server_id IN (${target_world_id});")
TOTAL_5_guild_source_wids_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM guild_info WHERE server_id IN (${source_world_ids_str});")
TOTAL_5_guild_merge_wids_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM guild_info WHERE server_id IN (${sorted_world_ids_str});")
echo "${dbname}, ${TOTAL_5_guild_target_wid_post}, ${TOTAL_5_guild_source_wids_post}, ${TOTAL_5_guild_merge_wids_post}"
echo

# GameDB > player_characters::flag & 4 = 4 更名 ( PRE )
echo "6. 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 WHERE world_id IN (${sorted_world_ids_str});"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${sorted_world_ids_str}) AND (flag & 4 = 4);"
TOTAL_6_pcs_target_wid_pre=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${target_world_id});")
TOTAL_6_pcs_source_wids_pre=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${source_world_ids_str});")
TOTAL_6_pcs_merge_wids_pre=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${sorted_world_ids_str});")
TOTAL_6_pcs_flag4_merge_wids_pre=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${sorted_world_ids_str}) AND (flag & 4 = 4);")
echo "${dbname}, ${TOTAL_6_pcs_target_wid_pre}, ${TOTAL_6_pcs_source_wids_pre}, ${TOTAL_6_pcs_merge_wids_pre}, ${TOTAL_6_pcs_flag4_merge_wids_pre}"
echo

# GameDB > player_characters::flag & 4 = 4 更名 ( POST )
echo "6. 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 WHERE world_id IN (${sorted_world_ids_str});"
psql -U postgres ${dbname} -c "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${sorted_world_ids_str}) AND (flag & 4 = 4);"
TOTAL_6_pcs_target_wid_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${target_world_id});")
TOTAL_6_pcs_source_wids_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${source_world_ids_str});")
TOTAL_6_pcs_merge_wids_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${sorted_world_ids_str});")
TOTAL_6_pcs_flag4_merge_wids_post=$(psql -U postgres ${dbname} -Atqc "SELECT COUNT(*) FROM player_characters WHERE world_id IN (${sorted_world_ids_str}) AND (flag & 4 = 4);")
echo "${dbname}, ${TOTAL_6_pcs_target_wid_post}, ${TOTAL_6_pcs_source_wids_post}, ${TOTAL_6_pcs_merge_wids_post}, ${TOTAL_6_pcs_flag4_merge_wids_post}"
echo

# AccountDB > related tables ( PRE )
echo "7. 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;\""
COUNT_7_worlds_pre=$(ssh ${account[AccountDBIP]} "psql -U postgres ${dbname} -Atqc \"SELECT COUNT(*) FROM worlds WHERE id BETWEEN ${START_WORLD_ID} AND ${END_WORLD_ID};\"")
COUNT_7_fake_worlds_pre=$(ssh ${account[AccountDBIP]} "psql -U postgres ${dbname} -Atqc \"SELECT COUNT(*) FROM fake_worlds WHERE id BETWEEN ${START_WORLD_ID} AND ${END_WORLD_ID};\"")
echo "${dbname}, ${COUNT_7_worlds_pre}, ${COUNT_7_fake_worlds_pre}"
echo

# AccountDB > related tables ( POST )
echo "7. AccountDB > related tables ( POST )"
dbname="${ACCOUNT_DB_NAME}${POSTFIX_AFTER}"
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;\""
COUNT_7_worlds_post=$(ssh ${account[AccountDBIP]} "psql -U postgres ${dbname} -Atqc \"SELECT COUNT(*) FROM worlds WHERE id BETWEEN ${START_WORLD_ID} AND ${END_WORLD_ID};\"")
COUNT_7_fake_worlds_post=$(ssh ${account[AccountDBIP]} "psql -U postgres ${dbname} -Atqc \"SELECT COUNT(*) FROM fake_worlds WHERE id BETWEEN ${START_WORLD_ID} AND ${END_WORLD_ID};\"")
echo "${dbname}, ${COUNT_7_worlds_post}, ${COUNT_7_fake_worlds_post}"
echo

echo "#========== Final Check ==========#"
CHECK_RESULT=0
if [ "${TOTAL_1_autosend_pre}" -eq "${TOTAL_1_autosend_post}" ] && [ "${TOTAL_1_redenvelope_pre}" -eq "${TOTAL_1_redenvelope_post}" ]; then
    (( CHECK_RESULT + 1 ))
    echo "1. WorldDB > autosend_info & redenvelope_info ( O )"
else
    echo "1. WorldDB > autosend_info & redenvelope_info ( X )"
fi

if [ "${TOTAL_2_activity_wheel_broadcast}" -eq 0 ] && [ "${TOTAL_2_activity_minigame_wheel_broadcast}" -eq 0 ]; then
    (( CHECK_RESULT + 1 ))
    echo "2. WorldDB > 清空 target db > activity_wheel_broadcast 跟 activity_minigame_wheel_broadcast ( O )"
else
    echo "2. WorldDB > 清空 target db > activity_wheel_broadcast 跟 activity_minigame_wheel_broadcast ( X )"
fi

if [ "${TOTAL_3_chat_group_0_2_post}" -eq 0 ]; then
    (( CHECK_RESULT + 1 ))
    echo "3. GameDB > chat_group (type=0 or type=2) 資料都砍掉 ( O )"
else
    echo "3. GameDB > chat_group (type=0 or type=2) 資料都砍掉 ( X )"
fi

if [ "${TOTAL_4_pcs_merge_wids_pre}" -eq "${TOTAL_4_pcs_target_wid_post}" ] && [ "${TOTAL_4_pcs_source_wids_post}" -eq 0 ]; then
    (( CHECK_RESULT + 1 ))
    echo "4. GameDB > player_characters::world_id ( O )"
else
    echo "4. GameDB > player_characters::world_id ( X )"
fi

if [ "${TOTAL_5_guild_merge_wids_pre}" -eq "${TOTAL_5_guild_target_wid_post}" ] && [ "${TOTAL_5_guild_source_wids_post}" -eq 0 ]; then
    (( CHECK_RESULT + 1 ))
    echo "5. GameDB > guild_info::server_id ( O )"
else
    echo "5. GameDB > guild_info::server_id ( X )"
fi

if [ "${TOTAL_6_pcs_flag4_merge_wids_post}" -eq 0 ]; then
    (( CHECK_RESULT + 1 ))
    echo "6. GameDB > player_characters::flag & 4 = 4 更名 ( O )"
else
    echo "6. GameDB > player_characters::flag & 4 = 4 更名 ( X )"
fi

source_world_ids_count=$(array_length "${source_world_ids[@]}")
if [ "${COUNT_7_worlds_post}" -eq 1 ] && [ "${COUNT_7_fake_worlds_post}" -eq "${source_world_ids_count}" ]; then
    (( CHECK_RESULT + 1 ))
    echo "7. AccountDB > related tables ( O )"
else
    echo "7. AccountDB > related tables ( X )"
fi
echo "#========== Final Check ==========#"
echo
