#!/usr/bin/env python3

"""
Genera un archivo de provision para demo-law-firm-2
a partir de una hoja de cálculo de Google (respuestas de formulario).

Uso:
    python scripts/generate_lawfirm_provision.py <google_sheet_url>

- Descarga la hoja como CSV.
- Toma la última fila con ESTADO = REQUIRED.
- Genera provision-demo-lawfirm-2.json en la misma carpeta del script.
"""

import csv
import json
import re
import sys
from pathlib import Path
from urllib.parse import urlparse

import urllib.request


def to_csv_export_url(sheet_url: str) -> str:
    """
    Convierte una URL de edición de Google Sheets a export CSV.
    Ejemplos aceptados:
      - https://docs.google.com/spreadsheets/d/ID/edit?usp=sharing
      - https://docs.google.com/spreadsheets/d/ID/
    """
    parsed = urlparse(sheet_url)
    if "docs.google.com" not in parsed.netloc or "/spreadsheets/" not in parsed.path:
        raise SystemExit("La URL no parece ser una Google Sheet válida.")

    # Mantener todo hasta el ID de la hoja
    parts = parsed.path.rstrip("/").split("/")
    try:
        d_index = parts.index("d")
        sheet_id = parts[d_index + 1]
    except (ValueError, IndexError):
        raise SystemExit("No se pudo extraer el ID de la hoja de la URL.")

    return f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv"


def slugify(text: str) -> str:
    text = text.strip().lower()
    text = text.replace("@", " at ")
    text = re.sub(r"[^a-z0-9]+", "-", text)
    text = re.sub(r"-+", "-", text)
    text = text.strip("-")
    return text or "demo-law-firm-2"


def get_by_contains(key_fragment: str, headers_norm, row, default: str = "") -> str:
    """Devuelve el valor de la primera columna cuyo encabezado CONTIENE el fragmento."""
    kf = key_fragment.lower()
    for h, v in zip(headers_norm, row):
        if kf in h:
            return (v or "").strip()
    return default


def get_by_exact(header_exact: str, headers_raw, row, default: str = "") -> str:
    """
    Devuelve el valor de la columna cuyo encabezado, una vez trimeado,
    coincide EXACTAMENTE con header_exact (case-insensitive).
    """
    target = header_exact.strip().lower()
    for h, v in zip(headers_raw, row):
        if h.strip().lower() == target:
            return (v or "").strip()
    return default


def main() -> None:
    if len(sys.argv) != 2:
        print("Uso: python scripts/generate_lawfirm_provision.py <google_sheet_url>")
        raise SystemExit(1)

    sheet_url = sys.argv[1]
    csv_url = to_csv_export_url(sheet_url)

    # Directorio base donde se guardarán los JSON
    project_root = Path(__file__).resolve().parents[1]
    output_dir = project_root / "database" / "seeders" / "project-data"
    output_dir.mkdir(parents=True, exist_ok=True)

    # Descargar CSV a memoria
    try:
        with urllib.request.urlopen(csv_url) as resp:
            content = resp.read().decode("utf-8")
    except Exception as exc:
        print(f"No se pudo descargar el CSV desde Google Sheets: {exc}")
        raise SystemExit(1)

    reader = csv.reader(content.splitlines())
    rows = list(reader)

    if len(rows) < 2:
        print("La hoja debe tener al menos encabezados y una fila de datos.")
        raise SystemExit(1)

    headers = rows[0]
    data_rows = rows[1:]

    # Normalizar encabezados
    headers_norm = [h.strip().lower() for h in headers]

    # Buscar la última fila con ESTADO = REQUIRED (si hubiera varias)
    chosen_row = None
    for row in reversed(data_rows):
        estado = get_by_contains("estado", headers_norm, row, default="")
        if estado.lower() == "required":
            chosen_row = row
            break

    if not chosen_row:
        print("No se encontró ninguna fila con ESTADO = REQUIRED. No se genera provision.")
        raise SystemExit(1)

    # Mapear campos desde el CSV de ejemplo
    name = get_by_contains("nombre del estudio jurídico", headers_norm, chosen_row) or "Demo Law Firm 2"
    domain = get_by_contains("dominio para el sitio web", headers_norm, chosen_row) or "demo-law-firm-2.bewpro.com"
    tagline = get_by_contains("eslogan o frase corta", headers_norm, chosen_row)
    description_long = get_by_contains("describa brevemente su estudio", headers_norm, chosen_row)
    services_text = get_by_contains("liste los servicios que ofrece", headers_norm, chosen_row)
    phone = get_by_contains("teléfono", headers_norm, chosen_row)
    # correo: encabezado "Dirección de correo electrónico"
    email = get_by_contains("dirección de correo electrónico", headers_norm, chosen_row)
    # dirección física: encabezado exactamente "Dirección"
    address = get_by_exact("Dirección", headers, chosen_row) or get_by_contains(" direccion ", headers_norm, chosen_row)
    hours = get_by_contains("horarios", headers_norm, chosen_row)
    instagram = get_by_contains("instagram", headers_norm, chosen_row)
    facebook = get_by_contains("facebook", headers_norm, chosen_row)
    whatsapp = get_by_contains("whatsapp", headers_norm, chosen_row)
    linkedin = get_by_contains("linkedin", headers_norm, chosen_row)
    logo = get_by_contains("logo", headers_norm, chosen_row)
    keywords = get_by_contains("palabras clave relacionadas a su estudio", headers_norm, chosen_row)
    goals = get_by_contains("aqui puedes colocar que objetivos tienes con tu pagina web", headers_norm, chosen_row)

    # El slug base se arma a partir del nombre del estudio
    project_slug = slugify(name)
    db_name = f"bp-{project_slug}"
    url = domain
    author = name

    description_parts = []
    if description_long:
        description_parts.append(description_long)
    if services_text:
        description_parts.append(services_text)
    description = " ".join(description_parts).strip()
    if not description:
        description = f"Sitio institucional para {name}."

    modules = ["services", "team", "blog", "references"]
    modules_navigation = {m: {"header": True, "footer": True} for m in modules}

    provision = {
        "_comment": "Provision generado automáticamente — demo-law-firm-2. Ejecutar: php artisan bewpro:provision RUTA/AL/PROVISION.json",
        "name": name,
        "db_name": db_name,
        "demo": "demo-law-firm-2",
        "tagline": tagline,
        "url": url,
        "author": author,
        "description": description,
        "modules": modules,
        "modules_navigation": modules_navigation,
        "contact": {
            "phone": phone,
            "email": email,
            "address": address,
            "hours": hours,
        },
        "social_media": {
            "instagram": {"url": instagram, "active": bool(instagram)},
            "facebook": {"url": facebook, "active": bool(facebook)},
            "linkedin": {"url": linkedin, "active": bool(linkedin)},
            "youtube": {"url": "", "active": False},
            "whatsapp": {"url": whatsapp, "active": bool(whatsapp)},
            "tripadvisor": {"url": "", "active": False},
        },
        "analytics": {
            "enabled": False,
            "tracking_id": "",
            "track_in_local": False,
        },
        "skin": "auto",
        "fonts": {
            "primary": "Lexend",
            "secondary": "Lexend",
            "tertiary": "Open Sans",
        },
        "schema_type": "LegalService",
        "seo_keywords": keywords or f"{name}, estudio jurídico, abogados, servicios legales",
        "header": {
            "cta_button": {
                "active": True,
                "title": "Contacto",
                "url": "/contact",
                "target": "_self",
                "style": "primary",
            }
        },
        "goals": goals,
        "logo": logo,
    }

    # Nombre del archivo: provision-demo-lawfirm-2-<slug-del-proyecto>.json
    output_path = output_dir / f"provision-demo-lawfirm-2-{project_slug}.json"
    output_path.write_text(json.dumps(provision, indent=2, ensure_ascii=False), encoding="utf-8")
    print(f"Provision generado en: {output_path}")


if __name__ == "__main__":
    main()

