"""ERGON - Seed usuarios demo (sprint 2 F13).

IMPORTANTE: estos son USUARIOS DE PRUEBA, no productivos. Cambiar passwords
antes de exponer el servidor fuera de localhost.

Seed idempotente:
  - admin@demo.local (rol admin, password: demo1234) -> acceso total
  - vitrium@demo.local (rol cliente, password: vitrium1234) -> solo obra VITR1

Si el usuario ya existe, no sobrescribe el hash (permite que admin haya cambiado
su password despues del seed inicial). Solo asegura que el rol y asignaciones
de obra estan correctos.
"""
from __future__ import annotations

import sqlite3
import sys
from pathlib import Path

DB_PATH = Path(__file__).parent / "ergon.db"

sys.path.insert(0, str(Path(__file__).parent))
import api_obras  # noqa: E402


USUARIOS_DEMO = [
    {
        "email": "admin@demo.local",
        "password": "demo1234",
        "nombre": "Admin Demo",
        "rol": "admin",
        "obras_codigos": [],  # admin ve todas, no necesita asignaciones
    },
    {
        "email": "vitrium@demo.local",
        "password": "vitrium1234",
        "nombre": "Vitrium Cliente Demo",
        "rol": "cliente",
        "obras_codigos": ["VITR1"],
    },
]


def seed():
    if not api_obras.bcrypt_available():
        raise SystemExit("ERROR: bcrypt no instalado. Ejecute: pip install bcrypt")

    conn = sqlite3.connect(str(DB_PATH))
    conn.row_factory = sqlite3.Row
    conn.execute("PRAGMA foreign_keys = ON")

    creados, existentes, asignaciones = 0, 0, 0

    for u in USUARIOS_DEMO:
        email = u["email"].lower()
        existing = conn.execute(
            "SELECT id, rol FROM usuarios WHERE email = ?", (email,)
        ).fetchone()

        if existing is None:
            conn.execute(
                "INSERT INTO usuarios (email, password_hash, nombre, rol, activo) "
                "VALUES (?, ?, ?, ?, 1)",
                (email, api_obras.hash_password(u["password"]),
                 u["nombre"], u["rol"]),
            )
            usuario_id = conn.execute(
                "SELECT id FROM usuarios WHERE email = ?", (email,)
            ).fetchone()["id"]
            creados += 1
            print(f"  [+] Creado: {email} ({u['rol']}) id={usuario_id} password={u['password']}")
        else:
            usuario_id = existing["id"]
            existentes += 1
            # Asegurar rol correcto sin tocar password
            if existing["rol"] != u["rol"]:
                conn.execute(
                    "UPDATE usuarios SET rol = ? WHERE id = ?",
                    (u["rol"], usuario_id),
                )
                print(f"  [~] Rol actualizado: {email} -> {u['rol']}")
            else:
                print(f"  [=] Ya existe: {email} (rol={u['rol']}) id={usuario_id}")

        # Asignar obras (idempotente)
        for codigo in u["obras_codigos"]:
            obra_row = conn.execute(
                "SELECT id FROM obras WHERE codigo = ?", (codigo,)
            ).fetchone()
            if obra_row is None:
                print(f"  [!] Obra {codigo} no existe, saltando asignacion para {email}")
                continue
            cur = conn.execute(
                "INSERT OR IGNORE INTO usuarios_obras (usuario_id, obra_id) "
                "VALUES (?, ?)",
                (usuario_id, obra_row["id"]),
            )
            if cur.rowcount > 0:
                asignaciones += 1
                print(f"      -> asignada obra {codigo} (obra_id={obra_row['id']})")

    conn.commit()

    # Resumen final
    total_usuarios = conn.execute("SELECT COUNT(*) AS n FROM usuarios").fetchone()["n"]
    total_asignaciones = conn.execute(
        "SELECT COUNT(*) AS n FROM usuarios_obras"
    ).fetchone()["n"]
    print()
    print(f"[F13 seed] Creados {creados}, existentes {existentes}, asignaciones nuevas {asignaciones}.")
    print(f"[F13 seed] Total usuarios: {total_usuarios} | Total asignaciones: {total_asignaciones}")
    print()
    print("Credenciales de prueba (no productivas):")
    for u in USUARIOS_DEMO:
        print(f"  {u['email']:<25} password: {u['password']:<15} rol: {u['rol']}")
    print()

    conn.close()


if __name__ == "__main__":
    seed()
