"""
Gera catalogo_carros_<data>.json para Moove a partir das pastas locais.

NAO faz scraping ao vivo do Mobiauto — usa os .docx + pastas que ja existem
em Downloads/moove estoque/. Quando o Rafael adiciona um carro novo (cria a
pasta + docx + fotos), basta rodar este script pra atualizar o JSON.

Padrao do docx esperado (mesmo gerado pelo script da Up Motors):
  Linha 1: ✅ <titulo>
  Linha 2: Ano: 2024/2025
  Linha 3: KM: 38081
  Linha 4: Cambio: Automatico
  Linha 5: Combustivel: Flex
  Linha 6: Cor: Preto
  Linha 7: Preco: R$ 128890.00

Saida: Downloads/moove estoque/catalogo_carros_<data>.json (formato igual ao
catalogo_carros do Quitcar/Up Motors, consumido por whatsapp_catalogo.py).

Rodar: python moove_atualizar.py
"""
import json
import re
import sys
from datetime import datetime
from pathlib import Path
from urllib.parse import quote

try:
    from docx import Document
except ImportError:
    print("ERRO: instalar python-docx -> pip install python-docx")
    sys.exit(1)

BASE = Path(r"C:\Users\P7530\Downloads\moove estoque")
HOJE = datetime.now().strftime("%Y-%m-%d")
OUT = BASE / f"catalogo_carros_{HOJE}.json"
WHATSAPP = "(34) 99644-2431"
WHATSAPP_RAW = "5534996442431"
LOJA = "Moove"
MOBIAUTO_DEALER = "95713"

# Pasta no formato "NNN - Marca Modelo - Ano"
PASTA_RE = re.compile(r"^(\d{3})\s*-\s*(.+?)\s*-\s*(\d{4})$")


def parse_docx(arq: Path) -> dict:
    """Le um .docx e extrai campos por regex linha-a-linha."""
    try:
        doc = Document(arq)
    except Exception as e:
        print(f"  ! Erro abrindo docx: {e}")
        return {}
    texto = "\n".join(p.text for p in doc.paragraphs if p.text.strip())
    # Mapa de chaves com acento -> chave normalizada que o resto do script usa
    CHAVE_MAP = {
        "ano": "ano", "km": "km",
        "cambio": "cambio", "câmbio": "cambio",
        "combustivel": "combustivel", "combustível": "combustivel",
        "cor": "cor",
        "preco": "preco", "preço": "preco",
    }
    campos = {}
    for linha in texto.split("\n"):
        linha = linha.strip()
        if linha.startswith("✅"):
            campos["titulo"] = linha.replace("✅", "").strip()
            continue
        # Aceita letras + acentos antes do ":"
        m = re.match(r"^([A-Za-zÀ-ÿ]+)\s*:\s*(.+)$", linha)
        if m:
            chave_raw = m.group(1).strip().lower()
            chave = CHAVE_MAP.get(chave_raw, chave_raw)
            campos[chave] = m.group(2).strip()
    return campos


def normalizar_preco(p: str) -> str:
    """'R$ 128890.00' / 'R$ 128.890,00' / '128890' -> '128890.00'"""
    if not p:
        return ""
    s = p.replace("R$", "").strip()
    if "," in s and "." in s:
        s = s.replace(".", "").replace(",", ".")
    elif "," in s:
        s = s.replace(",", ".")
    try:
        return f"{float(s):.2f}"
    except ValueError:
        return ""


def normalizar_km(k: str) -> str:
    """'128.890 km' / '128890' -> '128890'"""
    return re.sub(r"[^\d]", "", k or "") or "0"


def wa_link(modelo: str, ano: str) -> str:
    txt = f"Ola Rafael, tenho interesse no {modelo} {ano}"
    return f"https://wa.me/{WHATSAPP_RAW}?text=" + quote(txt)


def listar_carros() -> list[dict]:
    carros = []
    for pasta in sorted(BASE.iterdir()):
        if not pasta.is_dir():
            continue
        m = PASTA_RE.match(pasta.name)
        if not m:
            continue
        n = m.group(1)
        nome_modelo_ano = pasta.name  # nome completo da pasta

        # Marca = primeira palavra apos "NNN - "
        partes_nome = m.group(2).split(" ", 1)
        marca = partes_nome[0]
        modelo = partes_nome[1] if len(partes_nome) > 1 else partes_nome[0]
        ano_pasta = m.group(3)

        # Procurar docx
        docx_files = list(pasta.glob("*.docx"))
        campos = parse_docx(docx_files[0]) if docx_files else {}

        # Fotos
        fotos = sorted([f.name for f in pasta.glob("foto_*.jpg")])

        ano = campos.get("ano", f"{int(ano_pasta)-1}/{ano_pasta}")
        km = normalizar_km(campos.get("km", "0"))
        preco = normalizar_preco(campos.get("preco", ""))

        carro = {
            "n": n,
            "id": f"moove_{n}",  # Moove nao tem id Mobiauto disponivel aqui
            "marca": marca,
            "modelo": f"{marca} {modelo}".strip(),
            "modelo_ano": f"{marca} {modelo} {ano_pasta}".strip(),
            "titulo_completo": campos.get("titulo", f"{marca} {modelo}"),
            "ano": ano,
            "ano_pasta": ano_pasta,
            "km": km,
            "km_fmt": f"{int(km):,} km".replace(",", ".") if km.isdigit() else km,
            "cor": campos.get("cor", ""),
            "cambio": campos.get("cambio", ""),
            "combustivel": campos.get("combustivel", ""),
            "preco": preco,
            "preco_fmt": f"R$ {float(preco):,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") if preco else "",
            "whatsapp": WHATSAPP,
            "whatsapp_link": wa_link(f"{marca} {modelo}", ano_pasta),
            "pasta": pasta.name,
            "pasta_path": str(pasta),
            "qtd_fotos": len(fotos),
            "fotos": fotos,
            "url_site": f"https://www.mobiauto.com.br/lojas/{MOBIAUTO_DEALER}",
            "status": "ATIVO" if fotos and preco else "INCOMPLETO",
        }
        carros.append(carro)
    return carros


def main():
    carros = listar_carros()
    ativos = [c for c in carros if c["status"] == "ATIVO"]
    incompletos = [c for c in carros if c["status"] != "ATIVO"]

    with open(OUT, "w", encoding="utf-8") as f:
        json.dump(carros, f, ensure_ascii=False, indent=2)

    print(f"== {LOJA} {HOJE} ==")
    print(f"Total: {len(carros)} carros")
    print(f"Ativos: {len(ativos)}")
    print(f"Incompletos (sem foto ou sem preco): {len(incompletos)}")
    if incompletos:
        print("\nIncompletos:")
        for c in incompletos:
            print(f"  - {c['pasta']}  (fotos={c['qtd_fotos']}, preco={c['preco']!r})")
    print(f"\nJSON: {OUT}")


if __name__ == "__main__":
    main()
