#!/usr/bin/env python3
"""
rebuild_db.py — Reconstruye la base de datos KQ desde cero.
  1. Agrega campo 'rol' a la colección users
  2. Crea colecciones: classes, student_profiles, whiteboard_sessions
  3. Setea rol=teacher al usuario de Ale
"""
import json, urllib.request, urllib.error, getpass

PB_URL = "http://localhost:8091"

def req(method, path, data=None, token=None):
    url = f"{PB_URL}/api/{path}"
    body = json.dumps(data).encode() if data else None
    headers = {"Content-Type": "application/json"}
    if token:
        headers["Authorization"] = token
    r = urllib.request.Request(url, data=body, headers=headers, method=method)
    try:
        with urllib.request.urlopen(r) as resp:
            return json.loads(resp.read())
    except urllib.error.HTTPError as e:
        raise RuntimeError(f"HTTP {e.code}: {e.read().decode()}")

print("=== rebuild_db.py — Kings & Queens ===\n")
admin_email    = input("Email superuser admin: ").strip()
admin_password = getpass.getpass("Password: ")

resp  = req("POST", "collections/_superusers/auth-with-password",
            {"identity": admin_email, "password": admin_password})
token = resp["token"]
print("✓ Autenticado\n")

# ── Colecciones existentes ───────────────────────────────────────────────────
all_cols = req("GET", "collections?perPage=200", token=token)["items"]
existing = {c["name"]: c for c in all_cols}

# ── 1. Agregar campo 'rol' a users ───────────────────────────────────────────
print("[1/4] Actualizando colección 'users'...")
users_col = existing["users"]
current_fields = users_col.get("fields") or users_col.get("schema") or []
field_names = [f["name"] for f in current_fields]

if "rol" not in field_names:
    new_fields = current_fields + [{
        "name":      "rol",
        "type":      "select",
        "required":  False,
        "maxSelect": 1,
        "values":    ["teacher", "student"]
    }]
    req("PATCH", f"collections/{users_col['id']}", {
        "fields":     new_fields,
        "listRule":   "@request.auth.id != ''",
        "viewRule":   "@request.auth.id != ''",
        "createRule": "",
        "updateRule": "@request.auth.id = id",
        "deleteRule": None,
    }, token=token)
    print("  ✓ Campo 'rol' agregado")
else:
    print("  ℹ Campo 'rol' ya existe")

# ── 2. Crear colecciones faltantes ───────────────────────────────────────────
COLLECTIONS = [
    {
        "name": "classes",
        "type": "base",
        "fields": [
            {"name": "title",      "type": "text",   "required": True},
            {"name": "date",       "type": "text",   "required": True},
            {"name": "time_start", "type": "text",   "required": False},
            {"name": "time_end",   "type": "text",   "required": False},
            {"name": "meet_link",  "type": "url",    "required": False},
            {"name": "student_id", "type": "relation", "required": False,
             "collectionId": "_pb_users_auth_", "cascadeDelete": False, "maxSelect": 1},
            {"name": "status", "type": "select", "required": True,
             "maxSelect": 1, "values": ["scheduled","active","finished","cancelled"]},
            {"name": "notes", "type": "text", "required": False},
        ],
        "listRule":   "@request.auth.id != ''",
        "viewRule":   "@request.auth.id != ''",
        "createRule": "@request.auth.id != '' && @request.auth.rol = 'teacher'",
        "updateRule": "@request.auth.id != '' && @request.auth.rol = 'teacher'",
        "deleteRule": "@request.auth.id != '' && @request.auth.rol = 'teacher'",
    },
    {
        "name": "student_profiles",
        "type": "base",
        "fields": [
            {"name": "user_id", "type": "relation", "required": True,
             "collectionId": "_pb_users_auth_", "cascadeDelete": True, "maxSelect": 1},
            {"name": "level", "type": "select", "required": False,
             "maxSelect": 1, "values": [
                 "Beginner","Elementary","Pre-Intermediate",
                 "Intermediate","Upper-Intermediate","Advanced"
             ]},
            {"name": "phone",           "type": "text", "required": False},
            {"name": "notes",           "type": "text", "required": False},
            {"name": "enrollment_date", "type": "text", "required": False},
            {"name": "is_active",       "type": "bool", "required": False},
        ],
        "listRule":   "@request.auth.id != ''",
        "viewRule":   "@request.auth.id != ''",
        "createRule": "@request.auth.id != '' && @request.auth.rol = 'teacher'",
        "updateRule": "@request.auth.id != '' && @request.auth.rol = 'teacher'",
        "deleteRule": "@request.auth.id != '' && @request.auth.rol = 'teacher'",
    },
    {
        "name": "whiteboard_sessions",
        "type": "base",
        "fields": [
            {"name": "class_id", "type": "relation", "required": True,
             "collectionId": "classes", "cascadeDelete": True, "maxSelect": 1},
            {"name": "is_active",    "type": "bool", "required": False},
            {"name": "strokes_json", "type": "json", "required": False},
        ],
        "listRule":   "@request.auth.id != ''",
        "viewRule":   "@request.auth.id != ''",
        "createRule": "@request.auth.id != '' && @request.auth.rol = 'teacher'",
        "updateRule": "@request.auth.id != '' && @request.auth.rol = 'teacher'",
        "deleteRule": "@request.auth.id != '' && @request.auth.rol = 'teacher'",
    },
]

print("\n[2/4] Creando colecciones faltantes...")
for col in COLLECTIONS:
    name = col["name"]
    if name in existing:
        print(f"  ℹ '{name}' ya existe, saltando")
        continue
    try:
        req("POST", "collections", col, token=token)
        print(f"  ✓ '{name}' creada")
    except RuntimeError as e:
        print(f"  ✗ '{name}' error: {e}")

# ── 3. Setear rol=teacher a Ale ──────────────────────────────────────────────
print("\n[3/4] Seteando rol=teacher a Ale...")
users = req("GET", "collections/users/records?perPage=50", token=token)
teacher = next((u for u in users["items"] if u.get("rol") != "student"), None)

if teacher:
    req("PATCH", f"collections/users/records/{teacher['id']}",
        {"rol": "teacher"}, token=token)
    print(f"  ✓ {teacher['email']} → rol=teacher")
else:
    print("  ⚠ No se encontró usuario teacher")

# ── 4. Resumen ───────────────────────────────────────────────────────────────
print("\n[4/4] Estado final:")
users = req("GET", "collections/users/records?perPage=50", token=token)
for u in users["items"]:
    print(f"  {u.get('email')} | rol={u.get('rol','—')} | name={u.get('name','—')}")

cols_final = req("GET", "collections?perPage=200", token=token)["items"]
col_names = [c["name"] for c in cols_final if not c["name"].startswith("_")]
print(f"\n  Colecciones: {', '.join(col_names)}")
print("\n✅ Listo. Entrá a http://localhost:8080/app/kings-and-queens/app/")
