#!/usr/bin/env python3
"""
Siembra el árbol de categorías de 3 niveles (Rubro › Familia › Tipo) en la
colección `categorias`. Idempotente: matchea por (nombre, parent), así que se
puede correr las veces que haga falta sin duplicar.

- Rubro "Mueble a medida": las familias/tipos actuales (con `codigo` para tipear
  rápido al cargar una línea de presupuesto). AJUSTABLE por Edd desde /catalogo.
- Rubro "Otros": Cortes, Arreglos.
- Rubro "Muebles estándar (descatalogado)": se MIGRA desde los strings
  `productos.categoria` ("Familia / Tipo") que quedaron del import de Odoo, para
  conservar el histórico. Sin códigos (ya no se cargan).

Uso (desde el server):
  PB_URL=http://localhost:8102 PB_ADMIN_EMAIL=... PB_ADMIN_PASSWORD=... \
    python3 backend/scripts/seed_taxonomia.py
"""
import os
import sys

# Reusar los helpers del creador de colecciones (mismo patrón de auth/req).
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
from create_collections import auth_admin, req  # noqa: E402

RUBRO_MEDIDA = "Mueble a medida"
RUBRO_OTROS = "Otros"
RUBRO_ESTANDAR = "Muebles estándar (descatalogado)"

# Árbol del rubro "Mueble a medida": Familia -> [(Tipo, codigo)].
# Espejado del mix real de productos + ejemplos de Edd. Editable desde la UI.
MEDIDA = {
    "Cajoneras": [
        ("Cómoda", "CAJ-CO"),
        ("Chifonier", "CAJ-CH"),
        ("Cajonera de interior", "CAJ-IN"),
        ("Cajonera de pie", "CAJ-PIE"),
    ],
    "Estanterías": [
        ("Repisa", "EST-RE"),
        ("Estantería simple", "EST-SI"),
        ("Estantería de pie", "EST-PIE"),
        ("Estantería gruesa", "EST-GR"),
        ("Biblioteca", "EST-BI"),
    ],
    "Muebles infantiles": [
        ("Baúl / Juguetero", "INF-BA"),
        ("Silla / Mesa infantil", "INF-SI"),
        ("Escritorio infantil", "INF-ES"),
    ],
    "Mesas": [
        ("Mesa ratona", "MES-RA"),
        ("Mesa de luz", "MES-LU"),
        ("Mesa de comedor", "MES-CO"),
        ("Escritorio", "MES-ES"),
    ],
    "Placares": [
        ("Placard", "PLA-PL"),
        ("Interior de placard", "PLA-IN"),
        ("Frente de placard", "PLA-FR"),
    ],
    "Cocina": [
        ("Bajo mesada", "COC-BA"),
        ("Alacena", "COC-AL"),
        ("Mesada", "COC-ME"),
    ],
    "Racks y TV": [
        ("Rack", "RAC-RA"),
        ("Mueble de TV", "RAC-TV"),
    ],
    "Otros a medida": [
        ("Varios", "MED-VA"),
    ],
}

# Rubro "Otros" (no-muebles): familia = tipo (una sola línea).
OTROS = {
    "Cortes": [("Corte a medida", "COR")],
    "Arreglos": [("Arreglo / Reparación", "ARR")],
}


def q(s):
    return (s or "").replace('"', '')


def upsert_categoria(token, nombre, parent_id, codigo="", sort=0):
    """Match por (nombre, parent). Devuelve el id."""
    parent_clause = f'parent = "{parent_id}"' if parent_id else 'parent = ""'
    filt = f'nombre = "{q(nombre)}" && {parent_clause}'
    import urllib.parse
    qs = urllib.parse.urlencode({"filter": filt})
    code, data = req("GET", f"/api/collections/categorias/records?{qs}", token=token)
    items = data.get("items", []) if code == 200 else []
    payload = {
        "nombre": nombre,
        "parent": parent_id or "",
        "codigo": codigo or "",
        "sort_order": sort,
        "activa": True,
    }
    if items:
        rid = items[0]["id"]
        # No pisar un código ya editado a mano si el seed no trae uno.
        if not codigo and items[0].get("codigo"):
            payload.pop("codigo")
        req("PATCH", f"/api/collections/categorias/records/{rid}", token=token, body=payload)
        return rid
    code, data = req("POST", "/api/collections/categorias/records", token=token, body=payload)
    if code >= 300:
        print(f"  [warn] no se pudo crear '{nombre}': {code} {data}")
        return None
    return data["id"]


def seed_rubro(token, rubro_nombre, familias, sort_base):
    rubro_id = upsert_categoria(token, rubro_nombre, "", sort=sort_base)
    print(f"  Rubro: {rubro_nombre}")
    for fi, (familia, tipos) in enumerate(familias.items()):
        fam_id = upsert_categoria(token, familia, rubro_id, sort=fi)
        for ti, (tipo, codigo) in enumerate(tipos):
            upsert_categoria(token, tipo, fam_id, codigo=codigo, sort=ti)
    return rubro_id


def migrate_estandar(token):
    """Migra los strings `productos.categoria` ('Familia / Tipo') al rubro estándar."""
    rubro_id = upsert_categoria(token, RUBRO_ESTANDAR, "", sort=9)
    print(f"  Rubro: {RUBRO_ESTANDAR} (migrado de productos)")
    code, data = req("GET", "/api/collections/productos/records?perPage=500&fields=categoria", token=token)
    if code != 200:
        print("  [warn] no pude leer productos para migrar")
        return
    cats = sorted({(p.get("categoria") or "").strip() for p in data.get("items", []) if p.get("categoria")})
    familias = {}  # nombre familia -> id
    for full in cats:
        parts = [x.strip() for x in full.split("/")]
        familia = parts[0]
        tipo = parts[1] if len(parts) > 1 else None
        if familia not in familias:
            familias[familia] = upsert_categoria(token, familia, rubro_id, sort=len(familias))
        if tipo:
            upsert_categoria(token, tipo, familias[familia], sort=0)
    print(f"    {len(familias)} familias estándar migradas")


def main():
    print(f"== Seed taxonomía == PB={os.environ.get('PB_URL', 'http://localhost:8102')}")
    token = auth_admin()
    print("Authed OK")
    seed_rubro(token, RUBRO_MEDIDA, MEDIDA, sort_base=0)
    seed_rubro(token, RUBRO_OTROS, OTROS, sort_base=1)
    migrate_estandar(token)
    print("Done.")


if __name__ == "__main__":
    main()
