"""Run the account migration on a COPY of the live database and check nothing is lost."""
import os, sys, sqlite3, tempfile
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, ROOT); os.chdir(ROOT)
live = os.path.join(ROOT, "..", "_Data", "french_grades.db")
copy = os.path.join(tempfile.mkdtemp(), "copy.db")
src = sqlite3.connect(live); dst = sqlite3.connect(copy); src.backup(dst); src.close(); dst.close()
before = sqlite3.connect(copy)
users_before = before.execute("SELECT id, username, role, display_name FROM users ORDER BY id").fetchall()
att_before = before.execute("SELECT COUNT(*), COALESCE(SUM(points_earned),0) FROM attempts").fetchone()
before.close()
os.environ["DB_PATH"] = copy
os.environ.update(ADMIN_USERNAME="admin", ADMIN_PASSWORD="admin-pass-1")
for k in ("KID_USERNAME", "KID_PASSWORD", "PARENT_USERNAME", "PARENT_PASSWORD"):
    os.environ.pop(k, None)
from app import app
import accounts as ACC
after = sqlite3.connect(copy); after.row_factory = sqlite3.Row
users = [dict(r) for r in after.execute("SELECT id, username, role, display_name, parent_id, max_kids, active, avatar FROM users ORDER BY id")]
att_after = after.execute("SELECT COUNT(*), COALESCE(SUM(points_earned),0) FROM attempts").fetchone()
print("before:", users_before)
print("after :", users)
print("attempts before/after:", tuple(att_before), tuple(att_after))
assert tuple(att_before) == tuple(att_after)
for uid, name, role, disp in users_before:
    u = next(x for x in users if x["id"] == uid)
    assert (u["username"], u["role"], u["display_name"]) == (name, role, disp)
kid = next(x for x in users if x["role"] == "kid"); par = next(x for x in users if x["role"] == "parent")
assert kid["parent_id"] == par["id"], "kid linked to its parent"
assert any(x["role"] == "admin" for x in users)
c = app.test_client()
r = c.post("/api/login", json=dict(username=kid["username"], password="kid123")).get_json(); print("kid login with old password:", r)
assert r.get("ok")
h = sqlite3.connect(copy).execute("SELECT password_hash FROM users WHERE id=?", (kid["id"],)).fetchone()[0]
print("hash upgraded:", h.startswith("pbkdf2:"))
print("kid sees progress:", c.get("/api/me").get_json()["stats"])
print("MIGRATION OK")
