# BEGIN CHANGE: seed ot-test-server / ot-beta-server with core accounts + players from ot_new
import re, subprocess, os, sys

CFG = "/home/ubuntu/otx2_reseted/config.lua"
# 3842082 = templates Sorcerer/Druid/Paladin/Knight (fora da lista original, mas pedidos pelo nome)
ACCOUNTS = (1, 2, 3, 3104355, 2335016, 9579324, 7979865, 3842082)
TARGETS = ("ot-test-server", "ot-beta-server")
SKIP_CHILD = {
    "login_history",
    "market_history",
    "market_offers",
    "player_deaths",
    "player_killers",
    "player_statements",
    "server_reports",
    "polls",
    "trade_off_offers",
    "z_character_sales",
    "house_auctions",
    "guild_invites",
}

def cfg():
    t = open(CFG, encoding="latin-1", errors="ignore").read()
    def g(k):
        m = re.search(r'%s\s*=\s*"([^"]*)"' % k, t)
        if not m:
            raise SystemExit("missing " + k)
        return m.group(1)
    return g("sqlHost"), g("sqlUser"), g("sqlPass")

def write_cnf(path, host, user, pw):
    open(path, "w").write(
        "[client]\nhost=%s\nuser=%s\npassword='%s'\nprotocol=TCP\n"
        % (host, user, pw.replace("\\", "\\\\").replace("'", "\\'"))
    )

def mysql_bytes(cnf, *args, input=None):
    cmd = ["mysql", "--defaults-file=" + cnf] + list(args)
    r = subprocess.run(cmd, input=input, capture_output=True)
    if r.returncode != 0:
        sys.stderr.buffer.write(r.stderr)
        raise SystemExit(r.returncode)
    return r.stdout

def mysql_text(cnf, *args):
    return mysql_bytes(cnf, *args).decode("latin-1", errors="replace")

def mysqldump_bytes(cnf, *args):
    cmd = [
        "mysqldump", "--defaults-file=" + cnf,
        "--single-transaction", "--skip-lock-tables",
        "--no-create-info", "--complete-insert", "--skip-extended-insert",
        "--skip-triggers", "--default-character-set=latin1",
    ] + list(args)
    r = subprocess.run(cmd, capture_output=True)
    if r.returncode != 0:
        sys.stderr.buffer.write(r.stderr)
        raise SystemExit(r.returncode)
    return r.stdout

def align_serial_index(cnf, db, table):
    """Dump schema had UNIQUE(serial); live ot_new is non-unique. Align before seed."""
    row = mysql_text(cnf, "-N", "-e",
        "SELECT NON_UNIQUE FROM information_schema.STATISTICS "
        "WHERE TABLE_SCHEMA='%s' AND TABLE_NAME='%s' AND INDEX_NAME='serial' "
        "AND SEQ_IN_INDEX=1 LIMIT 1" % (db, table)).strip()
    if row == "0":
        print("fix %s.%s.serial UNIQUE -> INDEX" % (db, table))
        mysql_bytes(cnf, db, "-e",
            "ALTER TABLE `%s` DROP INDEX `serial`; "
            "ALTER TABLE `%s` ADD INDEX `serial` (`serial`);" % (table, table))

host, user, pw = cfg()
tmpdir = "/tmp/wa-seed-accounts"
os.makedirs(tmpdir, exist_ok=True)
cnf = os.path.join(tmpdir, "mysql.cnf")
write_cnf(cnf, host, user, pw)

acc_list = ",".join(str(x) for x in ACCOUNTS)
print("accounts:", acc_list)

pids = mysql_text(cnf, "-N", "ot_new", "-e",
    "SELECT id FROM players WHERE account_id IN (%s) ORDER BY id" % acc_list).strip().splitlines()
if not pids:
    raise SystemExit("no players found for accounts")
pid_list = ",".join(pids)
print("players (%d):" % len(pids), pid_list)

print(mysql_text(cnf, "ot_new", "-e",
    "SELECT id, name, account_id FROM players "
    "WHERE name IN ('Account Manager','Druid Sample','Sorcerer Sample','Paladin Sample',"
    "'Knight Sample','Sorcerer','Druid','Paladin','Knight') ORDER BY id"))

child_tables = [
    t for t in mysql_text(cnf, "-N", "-e", """
SELECT TABLE_NAME FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='ot_new' AND COLUMN_NAME='player_id'
ORDER BY TABLE_NAME
""").strip().splitlines()
    if t and t not in SKIP_CHILD
]
print("child tables:", ", ".join(child_tables))

for db in TARGETS:
    for table in ("player_items", "player_depotitems"):
        exists = mysql_text(cnf, "-N", "-e",
            "SELECT COUNT(*) FROM information_schema.TABLES "
            "WHERE TABLE_SCHEMA='%s' AND TABLE_NAME='%s'" % (db, table)).strip()
        if exists == "1":
            align_serial_index(cnf, db, table)

chunks_accounts = [
    b"SET NAMES latin1;\nSET FOREIGN_KEY_CHECKS=0;\n",
    mysqldump_bytes(cnf, "ot_new", "accounts", "--where=id IN (%s)" % acc_list),
    mysqldump_bytes(cnf, "ot_new", "players", "--where=account_id IN (%s)" % acc_list),
    b"\nSET FOREIGN_KEY_CHECKS=1;\n",
]
chunks_children = [b"SET NAMES latin1;\nSET FOREIGN_KEY_CHECKS=0;\n"]
for t in child_tables:
    print("dump", t)
    chunks_children.append(mysqldump_bytes(cnf, "ot_new", t, "--where=player_id IN (%s)" % pid_list))
chunks_children.append(b"\nSET FOREIGN_KEY_CHECKS=1;\n")

seed_acc = os.path.join(tmpdir, "seed_accounts.sql")
seed_child = os.path.join(tmpdir, "seed_children.sql")
open(seed_acc, "wb").write(b"".join(chunks_accounts))
open(seed_child, "wb").write(b"".join(chunks_children))
print("wrote", seed_acc, os.path.getsize(seed_acc), "and", seed_child, os.path.getsize(seed_child))

acc_data = open(seed_acc, "rb").read()
child_data = open(seed_child, "rb").read()
for db in TARGETS:
    print("==> seeding", db)
    wipe = ["SET FOREIGN_KEY_CHECKS=0;"]
    for t in child_tables:
        wipe.append("TRUNCATE TABLE `%s`;" % t)
    wipe.append("TRUNCATE TABLE `players`;")
    wipe.append("TRUNCATE TABLE `accounts`;")
    wipe.append("SET FOREIGN_KEY_CHECKS=1;")
    mysql_bytes(cnf, db, "-e", "\n".join(wipe))
    mysql_bytes(cnf, db, input=acc_data)
    # trigger oncreate_players cria skills default; limpa antes do dump real
    mysql_bytes(cnf, db, "-e",
        "DELETE FROM player_skills WHERE player_id IN (%s);" % pid_list)
    mysql_bytes(cnf, db, input=child_data)
    # BEGIN CHANGE: nao copiar flags online do prod (evita "X online" fantasma no portal test/beta)
    mysql_bytes(cnf, db, "-e", "UPDATE players SET online = 0;")
    # END CHANGE
    print(mysql_text(cnf, db, "-e",
        "SELECT COUNT(*) AS accounts FROM accounts; "
        "SELECT COUNT(*) AS players FROM players; "
        "SELECT COUNT(*) AS items FROM player_items; "
        "SELECT id, name FROM players WHERE name IN ("
        "'Account Manager','Druid Sample','Sorcerer Sample','Paladin Sample',"
        "'Knight Sample','Sorcerer','Druid','Paladin','Knight') ORDER BY id;"))

os.remove(cnf)
print("OK")
# END CHANGE
