#!/usr/bin/env python3
import argparse
import psycopg2
import psycopg2.extras
import server

ROLE_PRESETS = {
    "player": 6917529027641081856,
    "isd":    6917529027641344256,
    "gm":     7131450362141085952,
}

def main():
    p = argparse.ArgumentParser(description="Manage Dystropia EVE Accounts")
    sub = p.add_subparsers(dest="cmd", required=True)
    sub.add_parser("list")

    p_add = sub.add_parser("create")
    p_add.add_argument("username")
    p_add.add_argument("--char", default=None)
    p_add.add_argument("--role", choices=["player", "isd", "gm"], default="player")
    p_add.add_argument("--ship", type=int, default=601)

    p_pw = sub.add_parser("reset-pw")
    p_pw.add_argument("username")

    p_del = sub.add_parser("delete")
    p_del.add_argument("username")

    args = p.parse_args()
    conn = server.get_db_conn(server.load_config())
    with conn:
        with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as cur:
            if args.cmd == "list":
                cur.execute(
                    "SELECT u.user_id, u.user_name, u.role, (u.password_hash IS NOT NULL) AS has_pw, "
                    "c.character_id, c.character_name, c.ship_type_id "
                    "FROM users u LEFT JOIN characters c ON c.user_id = u.user_id ORDER BY u.user_id"
                )
                for r in cur.fetchall():
                    print(dict(r))
            elif args.cmd == "create":
                uname = args.username.strip()
                cname = (args.char or uname.capitalize()).strip()
                cur.execute(
                    "INSERT INTO users (user_name, password_hash, role, user_type, character_slots) "
                    "VALUES (%s, NULL, %s, 30, 3) RETURNING *",
                    (uname, ROLE_PRESETS[args.role])
                )
                u = cur.fetchone()
                cid = 90000000 + int(u["user_id"])
                cur.execute(
                    "INSERT INTO characters (character_id, user_id, character_name, ship_type_id, balance, skill_points) "
                    "VALUES (%s, %s, %s, %s, 1000000000.0, 5000000)",
                    (cid, u["user_id"], cname, args.ship)
                )
                print("[+] Created user:", uname, "char:", cname, "char_id:", cid)
            elif args.cmd == "reset-pw":
                cur.execute("UPDATE users SET password_hash = NULL WHERE LOWER(user_name) = LOWER(%s) RETURNING user_id, user_name", (args.username,))
                print("[+] Reset password to TOFU:", cur.fetchone())
            elif args.cmd == "delete":
                cur.execute("DELETE FROM characters WHERE user_id IN (SELECT user_id FROM users WHERE LOWER(user_name) = LOWER(%s))", (args.username,))
                cur.execute("DELETE FROM users WHERE LOWER(user_name) = LOWER(%s) RETURNING user_id, user_name", (args.username,))
                print("[-] Deleted:", cur.fetchone())

if __name__ == "__main__":
    main()
