#!/usr/bin/env python3
"""
Construye database/seeders/products/alias-matrix.json:
  - Carga los 72 aliases existentes de la base vieja (doc/airtable-backup/bewpro-old/alias-dictionary.json)
  - Identifica las combinaciones faltantes
  - Genera aliases + pitches estratégicos para las combinaciones faltantes con IA (Claude API)
  - Salida: alias-matrix.json con 108 combinaciones completas

Uso: python3 scripts/generate-alias-matrix.py [--dry-run]
     (dry-run: muestra faltantes sin llamar a Claude)

Requiere: ANTHROPIC_API_KEY en entorno o en .env
"""

import json
import os
import sys
import urllib.request
import re

DRY_RUN = "--dry-run" in sys.argv

# ──────────────────────────────────────────────
# Definición del universo
# ──────────────────────────────────────────────

MODULES = [
    "services", "faqs", "blog", "gallery", "projects",
    "products", "team", "references", "news", "menu",
    "testimonials", "tokko",
]

INDUSTRIES = [
    "law-corporate",
    "health-medical",
    "real-estate",
    "retail-gastro",
    "tech-saas",
    "art-design",
    "institutional",
    "finance",
    "personal",
]

# Tokko es exclusivo de real-estate
EXCLUSIONS = {
    "tokko": [i for i in INDUSTRIES if i != "real-estate"],
    # menu es exclusivo de retail-gastro (y a veces institutional/personal)
    "menu": [i for i in INDUSTRIES if i not in ("retail-gastro", "institutional", "personal")],
}

INDUSTRY_LABELS = {
    "law-corporate":  "Derecho & Corporativo",
    "health-medical": "Salud & Medicina",
    "real-estate":    "Inmobiliaria",
    "retail-gastro":  "Retail & Gastronomía",
    "tech-saas":      "Tech & SaaS",
    "art-design":     "Arte & Diseño",
    "institutional":  "Institucional / ONG",
    "finance":        "Finanzas & Inversión",
    "personal":       "Personal / Freelancer",
}

MODULE_LABELS = {
    "services":     "Services (catálogo de servicios/soluciones)",
    "faqs":         "FAQs (preguntas frecuentes / resolución de objeciones)",
    "blog":         "Blog (contenido editorial / SEO)",
    "gallery":      "Gallery (galería visual)",
    "projects":     "Projects (portfolio / casos de éxito)",
    "products":     "Products (catálogo de productos con precios)",
    "team":         "Team (perfiles del equipo)",
    "references":   "References (logos de socios/clientes / prueba social)",
    "news":         "News (comunicados y noticias corporativas)",
    "menu":         "Menu (carta digital gastronómica)",
    "testimonials": "Testimonials (reseñas y testimonios de clientes)",
    "tokko":        "Tokko (integración API de propiedades inmobiliarias)",
}

# ──────────────────────────────────────────────
# Cargar datos existentes de la base vieja
# ──────────────────────────────────────────────

with open("docs/airtable-backup/bewpro-old/alias-dictionary.json") as f:
    old_records = json.load(f)

# Map "Module Name - Industry Name" → {alias, pitch}
OLD_INDUSTRY_MAP = {
    "Real Estate":    "real-estate",
    "Health & Medical": "health-medical",
    "Law & Corporate":  "law-corporate",
    "Tech & SaaS":      "tech-saas",
    "Art & Design":     "art-design",
    "Institucional":    "institutional",
    "Finance":          "finance",
}

OLD_MODULE_MAP = {
    "References":            "references",
    "FAQs":                  "faqs",
    "Team":                  "team",
    "Blog":                  "blog",
    "Gallery":               "gallery",
    "Products":              "products",
    "Services":              "services",
    "Projects":              "projects",
    "News":                  "news",
    "Testimonials":          "testimonials",
    "Tokko API Integration": "tokko",
    "BP Base system":        "bp-base",
}

existing = {}
for r in old_records:
    f = r.get("fields", {})
    uid = f.get("Unique ID", "")  # format: "Module Name - Industry Name"
    alias = f.get("Translated Alias", "").strip()
    if not uid or not alias:
        continue
    # Parse UID
    parts = uid.rsplit(" - ", 1)
    if len(parts) != 2:
        continue
    mod_name, ind_name = parts
    mod_slug = OLD_MODULE_MAP.get(mod_name.strip())
    ind_slug = OLD_INDUSTRY_MAP.get(ind_name.strip())
    if mod_slug and ind_slug:
        existing[(mod_slug, ind_slug)] = {"alias": alias}

print(f"Aliases existentes cargados: {len(existing)}")

# ──────────────────────────────────────────────
# Identificar faltantes
# ──────────────────────────────────────────────

missing = []
for mod in MODULES:
    excluded_industries = EXCLUSIONS.get(mod, [])
    for ind in INDUSTRIES:
        if ind in excluded_industries:
            continue
        if (mod, ind) not in existing:
            missing.append((mod, ind))

print(f"Combinaciones faltantes: {len(missing)}")
if DRY_RUN:
    print("\nFaltantes:")
    for mod, ind in missing:
        print(f"  {mod} × {ind}")
    sys.exit(0)

# ──────────────────────────────────────────────
# Generar con Claude las combinaciones faltantes + todos los pitches
# ──────────────────────────────────────────────

# Read Anthropic API key from .env
anthropic_key = None
env_path = ".env"
if os.path.exists(env_path):
    with open(env_path) as ef:
        for line in ef:
            if line.startswith("ANTHROPIC_API_KEY="):
                anthropic_key = line.split("=", 1)[1].strip().strip('"\'')
if not anthropic_key:
    anthropic_key = os.environ.get("ANTHROPIC_API_KEY")
if not anthropic_key:
    print("ERROR: ANTHROPIC_API_KEY no encontrada en .env ni en entorno")
    sys.exit(1)

# Build few-shot examples from existing (take a sample)
examples_list = []
for (mod, ind), data in list(existing.items())[:15]:
    examples_list.append(
        f'  {{"{mod}": {{"{ind}": {{"alias": "{data["alias"]}", "pitch": "...a completar..."}}}}}}'
    )

# Build the full list of combinations to generate
to_generate = []
# Include missing (need alias + pitch) and existing (need pitch only)
for mod in MODULES:
    excluded_industries = EXCLUSIONS.get(mod, [])
    for ind in INDUSTRIES:
        if ind in excluded_industries:
            continue
        alias = existing.get((mod, ind), {}).get("alias", "")
        to_generate.append({
            "module": mod,
            "industry": ind,
            "existing_alias": alias,
        })

# Build prompt
combinations_text = "\n".join(
    f'  - {item["module"]} × {INDUSTRY_LABELS[item["industry"]]}'
    + (f' [alias ya existe: "{item["existing_alias"]}"]' if item["existing_alias"] else " [NUEVO]")
    for item in to_generate
)

prompt = f"""Sos el estratega de producto de BewPro, una plataforma SaaS de sitios web modulares.

El producto BewPro funciona así:
- Hay 12 módulos funcionales (blog, services, gallery, faqs, etc.)
- Cada módulo puede presentarse de forma diferente según la industria del cliente
- El "alias" es el nombre comercial del módulo para esa industria específica
- El "pitch" es un texto breve (~25 palabras) que explica por qué ese módulo es valioso para esa industria

Generá aliases y pitches estratégicos para las siguientes combinaciones:

{combinations_text}

Contexto de las industrias:
{json.dumps(INDUSTRY_LABELS, ensure_ascii=False, indent=2)}

Contexto de los módulos:
{json.dumps(MODULE_LABELS, ensure_ascii=False, indent=2)}

Reglas:
1. El alias debe ser el nombre que ese módulo tendría si estuviera en el sitio web de esa industria (ej: "Services" para abogados → "Áreas de Práctica")
2. El pitch debe ser directo, estratégico, en español, ~20-30 palabras. Debe hablar de VALOR REAL para esa industria, no frases genéricas.
3. Si el alias ya existe (indicado con [alias ya existe: "...]), mantenelo exactamente y solo generá el pitch.
4. Para combinaciones NUEVAS, creá un alias natural y específico para esa industria.
5. Idioma: español latinoamericano.

Devolvé SOLO un JSON válido con esta estructura exacta:
{{
  "module_slug": {{
    "industry_slug": {{
      "alias": "Nombre comercial para esa industria",
      "pitch": "Por qué este módulo es valioso para esa industria."
    }}
  }}
}}

Incluí TODAS las combinaciones de la lista. Nada más.
"""

print(f"\nGenerando {len(to_generate)} combinaciones con Claude...")

# Call Claude API
request_body = json.dumps({
    "model": "claude-opus-4-6",
    "max_tokens": 8000,
    "messages": [{"role": "user", "content": prompt}]
}).encode()

req = urllib.request.Request(
    "https://api.anthropic.com/v1/messages",
    data=request_body,
    headers={
        "x-api-key": anthropic_key,
        "anthropic-version": "2023-06-01",
        "content-type": "application/json",
    }
)

with urllib.request.urlopen(req) as resp:
    result = json.loads(resp.read())

raw_text = result["content"][0]["text"].strip()

# Extract JSON from response
json_match = re.search(r'\{[\s\S]+\}', raw_text)
if not json_match:
    print("ERROR: No se pudo extraer JSON de la respuesta")
    print(raw_text[:500])
    sys.exit(1)

generated = json.loads(json_match.group())
print(f"✅ Claude generó {sum(len(v) for v in generated.values())} combinaciones")

# ──────────────────────────────────────────────
# Merge y guardar
# ──────────────────────────────────────────────

# Use generated as base (it has all combinations with proper pitches)
final_matrix = generated

out_path = "database/seeders/products/alias-matrix.json"
os.makedirs(os.path.dirname(out_path), exist_ok=True)
with open(out_path, "w", encoding="utf-8") as f:
    json.dump(final_matrix, f, ensure_ascii=False, indent=2)

total = sum(len(v) for v in final_matrix.values())
print(f"\n✅ alias-matrix.json guardado: {len(final_matrix)} módulos × {total} combinaciones")
print(f"   Archivo: {out_path}")
print(f"\nRevisá el archivo antes de importar a Airtable.")
