#!/bin/bash
[ "$1" == "" ] && exec echo "Usage: $0 <TABLE_NAME>"

source $HOME/.gamerc

SCRIPT_NAME=$(basename "$0")
LOCK_FILE="/home/n1admin/www/promotion_upload/.${SCRIPT_NAME}.lock"

exec 200>"${LOCK_FILE}"
flock -n 200 || {
        echo "${SCRIPT_NAME} is running. Exiting."
    exit 1
}

TABLE_NAME=$1

get_table_primay_key_orders () {
    TABLE_NAME=$1
    RETURN=$(psql -U postgres ${GAME_TYPE}Account -c "
           COPY (SELECT a.attnum  AS column_number FROM pg_index i
            JOIN pg_class t ON t.oid = i.indrelid
            JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(i.indkey)
            WHERE
            i.indisprimary AND t.relname = '${TABLE_NAME}' AND pg_catalog.pg_table_is_visible(t.oid)) TO STDOUT;")
    echo ${RETURN}
}

rm -rf /home/n1admin/www/promotion_upload/itemmall_web/${TABLE_NAME}.diff*; 

mkdir -p /home/n1admin/www/promotion_upload/itemmall_web/test/; cd /home/n1admin/www/promotion_upload/itemmall_web/test; echo "Dump ${TABLE_NAME} on TEST ..."; pg_dump -U postgres ${GAME_TYPE}Account -t ${TABLE_NAME} > ${TABLE_NAME}_testbackup_new_current.sql

ssh ACCOUNTDB "echo 'Dump ${TABLE_NAME} on LIVE ...'; pg_dump -U postgres ${GAME_TYPE}Account -t ${TABLE_NAME} > /tmp/${TABLE_NAME}_livebackup_old_current.sql"
mkdir -p /home/n1admin/www/promotion_upload/itemmall_web/live/; cd /home/n1admin/www/promotion_upload/itemmall_web/live; rsync -avz ACCOUNTDB:/tmp/${TABLE_NAME}_livebackup_old_current.sql . >/dev/null 2>&1

cd /home/n1admin/www/promotion_upload/itemmall_web
pkey_search=$(get_table_primay_key_orders ${TABLE_NAME})
echo ${pkey_search}

input_file="${TABLE_NAME}.diff.content"
pkey_file="${TABLE_NAME}.diff.pkey"
modify_file="${TABLE_NAME}.diff.content.modify"
new_file="${TABLE_NAME}.diff.content.new"
delete_file="${TABLE_NAME}.diff.content.delete"
output_file="${TABLE_NAME}.diff.output"

diff test/${TABLE_NAME}_testbackup_new_current.sql live/${TABLE_NAME}_livebackup_old_current.sql | grep -E -a -v 'Dump' | grep -E -a '<|>' > ${input_file}
cat ${input_file}

# Build dynamic key and print expressions
key_expr=""
out_expr=""
for col in $pkey_search; do
    key_expr="$key_expr\$${col} FS "
    out_expr="$out_expr\$${col} OFS "
done
# Remove trailing FS / OFS
key_expr="${key_expr% FS }"
out_expr="${out_expr% OFS }"

# Final AWK script
awk_script=$(cat <<EOF
BEGIN { OFS = " " }
NF == 0 { next }
{
    sub(/^[><] /, "", \$0)
    split(\$0, fields, /[ \t]+/)
    key = $key_expr
    if (!(key in seen)) {
        seen[key] = 1
        print $out_expr
    }
}
EOF
)

# Output unique pkey
awk "$awk_script" "${input_file}" | sort -k1,1 > "${pkey_file}"
cat ${pkey_file}

echo "====== Modify ======" >> ${modify_file}
echo "====== New ======" >> ${new_file}
echo "====== Delete ======" >> ${delete_file}

if [ -s "${pkey_file}" ]; then
    # Loop over each primary key
    while IFS= read -r key; do
        # Escape key for grep
        grep_key=$(printf "%s" "$key" | sed 's/[][\.*^$(){}?+|/]/\\&/g')

        # Extract matching lines
        matches=$(grep -E "^[<>] .*\b$grep_key\b" "$input_file")
        count=$(echo "$matches" | wc -l)

        if [ "$count" -eq 2 ] && echo "$matches" | grep -q '^<' && echo "$matches" | grep -q '^>'; then
            {
                echo "$key"
                echo "$matches"
            } >> "$modify_file"
        elif [ "$count" -eq 1 ] && echo "$matches" | grep -q '^<'; then
            {
                echo "$key"
                echo "$matches"
            } >> "$new_file"
        elif [ "$count" -eq 1 ] && echo "$matches" | grep -q '^>'; then
            {
                echo "$key"
                echo "$matches"
            } >> "$delete_file"
        fi
    done < "$pkey_file"       
fi

[ -f "${output_file}" ] && rm -rf ${output_file}
echo >> ${output_file}
cat ${new_file} >> ${output_file}
echo >> ${output_file}
cat ${modify_file} >> ${output_file}
echo >> ${output_file}
cat ${delete_file} >> ${output_file}

cat ${output_file}
