#!/usr/bin/env python3
"""
setup_pocketbase.py — Kings & Queens
Crea el admin inicial y todas las colecciones en la nueva instancia de PocketBase.

Uso:
  python setup_pocketbase.py

El script:
  1. Crea el admin con el email/password que ingreses
  2. Se autentica con ese admin
  3. Crea las 4 colecciones (users ya existe, solo agrega campos)
  4. Muestra un resumen de lo creado
"""

import json
import urllib.request
import urllib.error
import 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
    request = urllib.request.Request(url, data=body, headers=headers, method=method)
    try:
        with urllib.request.urlopen(request) as resp:
            return json.loads(resp.read())
    except urllib.error.HTTPError as e:
        err = e.read().decode()
        raise RuntimeError(f"HTTP {e.code} {method} {path}: {err}")


def main():
    print("=" * 55)
    print("  Kings & Queens — PocketBase Setup")
    print(f"  Instancia: {PB_URL}")
    print("=" * 55)

    # ── 1. Credenciales ─────────────────────────────────────────
    print("\n[1/4] Credenciales del superuser")
    print("  (Superuser creado via: docker exec eddos-kq-pocketbase /pb/pocketbase superuser create EMAIL PASS)")
    email    = input("  Email: ").strip()
    password = getpass.getpass("  Contraseña: ")

    # ── 2. Autenticar ───────────────────────────────────────────
    print("\n[2/4] Autenticando...")
    resp  = req("POST", "collections/_superusers/auth-with-password", {"identity": email, "password": password})
    token = resp["token"]
    print("  ✓ Token obtenido")

    # ── 3. Colecciones ──────────────────────────────────────────
    print("\n[3/4] Creando colecciones...")

    collections = [
        # users (auth) — campos extra sobre la colección built-in
        {
            "name": "users",
            "type": "auth",
            "schema": [
                {"name": "role",         "type": "select", "required": True,
                 "options": {"maxSelect": 1, "values": ["teacher", "student"]}},
                {"name": "display_name", "type": "text",   "required": False},
            ],
            "listRule":   "@request.auth.id != ''",
            "viewRule":   "@request.auth.id != ''",
            "createRule": "",
            "updateRule": "@request.auth.id = id",
            "deleteRule": None,
        },
        # classes
        {
            "name": "classes",
            "type": "base",
            "schema": [
                {"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,
                 "options": {"collectionId": "_pb_users_auth_", "cascadeDelete": False, "maxSelect": 1}},
                {"name": "status",     "type": "select", "required": True,
                 "options": {"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.role = 'teacher'",
            "updateRule": "@request.auth.id != '' && @request.auth.role = 'teacher'",
            "deleteRule": "@request.auth.id != '' && @request.auth.role = 'teacher'",
        },
        # student_profiles
        {
            "name": "student_profiles",
            "type": "base",
            "schema": [
                {"name": "user_id", "type": "relation", "required": True,
                 "options": {"collectionId": "_pb_users_auth_", "cascadeDelete": True, "maxSelect": 1}},
                {"name": "level", "type": "select", "required": False,
                 "options": {"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.role = 'teacher'",
            "updateRule": "@request.auth.id != '' && @request.auth.role = 'teacher'",
            "deleteRule": "@request.auth.id != '' && @request.auth.role = 'teacher'",
        },
        # whiteboard_sessions
        {
            "name": "whiteboard_sessions",
            "type": "base",
            "schema": [
                {"name": "class_id", "type": "relation", "required": True,
                 "options": {"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.role = 'teacher'",
            "updateRule": "@request.auth.id != '' && @request.auth.role = 'teacher'",
            "deleteRule": "@request.auth.id != '' && @request.auth.role = 'teacher'",
        },
    ]

    # Fetch existing collections to avoid duplicates
    existing = {c["name"] for c in req("GET", "collections?perPage=200&fields=name", token=token).get("items", [])}

    created = []
    updated = []
    for col in collections:
        name = col["name"]
        if name in existing:
            # Update schema of existing (e.g., users)
            col_list = req("GET", f"collections?filter=name='{name}'", token=token)["items"]
            if col_list:
                col_id = col_list[0]["id"]
                req("PATCH", f"collections/{col_id}", col, token=token)
                updated.append(name)
        else:
            req("POST", "collections", col, token=token)
            created.append(name)

    print(f"  ✓ Creadas:     {', '.join(created) if created else '—'}")
    print(f"  ✓ Actualizadas: {', '.join(updated) if updated else '—'}")

    # ── 4. Resumen ──────────────────────────────────────────────
    print("\n[4/4] Resumen")
    print(f"  Admin UI:  http://localhost:8091/_/")
    print(f"  API base:  {PB_URL}/api/")
    print()
    print("  Próximos pasos:")
    print("  1. Configura el túnel en Cloudflare:")
    print("     kq-db.edd-os.com.ar → eddos-kq-pocketbase:8090")
    print("  2. Crea la cuenta de Ale desde el Admin UI o ejecuta:")
    print("     python setup_pocketbase.py --create-teacher")
    print("  3. Actualiza PB_URL en los 4 archivos HTML:")
    print("     const PB_URL = 'https://kq-db.edd-os.com.ar';")
    print()
    print("  ✅ Setup completado")


if __name__ == "__main__":
    main()
