"""
Atualização do estoque Quitcar — 2026-05-31
- Compara estoque antigo (88 carros) com o site atual (82 carros)
- Baixa fotos dos 17 carros NOVOS em pastas 089-105
- Gera catalogo_carros_2026-05-31.csv/json e RELATORIO_ATUALIZACAO_2026-05-31.md
"""
import csv
import json
import os
import re
import sys
import time
from pathlib import Path
from urllib.parse import quote

import requests

BASE = Path(r"C:\Users\P7530\Downloads\quitcar estoque")
OBSIDIAN = Path(r"C:\Users\P7530\Documents\Obsidian Vault\Quitcar")
HOJE = "2026-05-31"
WHATSAPP = "(34) 99644-2431"
WHATSAPP_RAW = "5534996442431"

HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/120.0 Safari/537.36",
    "Accept-Language": "pt-BR,pt;q=0.9,en;q=0.8",
}

# ---------- 17 carros NOVOS (entraram no estoque após 30/maio) ----------
# Numeração 089-105, no fim da lista atual.
NOVOS = [
    {"n":"089","id":"1007721","marca":"VolksWagen","modelo":"VolksWagen Parati 1.6Mi",
     "ano":"2007","km":"208168","preco":"37980","cor":"Prata",
     "titulo":"VolksWagen Parati 1.6Mi/1.6Mi City/T.Field T.Flex Flex 4 portas",
     "url":"https://quitcar.com.br/carros/vw-volkswagen/parati-1-6mi-1-6mi-city-t-field-t-flex/2007/1007721",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"090","id":"1006389","marca":"GWM","modelo":"GWM Tank 300 Hibrido",
     "ano":"2026","km":"2576","preco":"359000","cor":"Preto",
     "titulo":"GWM Tank 300 2.0 16V AWD Aut. (Hibrido) Gasolina e Elétrico 4 portas",
     "url":"https://quitcar.com.br/carros/gwm/tank-300-2-0-16v-awd-aut-hibrido/2026/1006389",
     "cambio":"Automatico","combustivel":"Hibrido"},
    {"n":"091","id":"649196","marca":"Fiat","modelo":"Fiat Toro Freedom",
     "ano":"2019","km":"118953","preco":"91980","cor":"",
     "titulo":"Fiat Toro Freedom 1.8 16V Flex Aut. Flex 4 portas",
     "url":"https://quitcar.com.br/carros/fiat/toro-freedom-1-8-16v-flex-aut/2019/649196",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"092","id":"1011351","marca":"VolksWagen","modelo":"VolksWagen TAOS Highline",
     "ano":"2022","km":"70058","preco":"133980","cor":"",
     "titulo":"VolksWagen TAOS Highline 1.4 250 TSI Flex Aut. Flex 4 portas",
     "url":"https://quitcar.com.br/carros/vw-volkswagen/taos-highline-1-4-250-tsi-flex-aut/2022/1011351",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"093","id":"1013137","marca":"Caoa Chery","modelo":"Caoa Chery Tiggo 3X Pro",
     "ano":"2022","km":"60979","preco":"73980","cor":"",
     "titulo":"Caoa Chery Tiggo 3X Pro 1.0 Turbo Flex Aut. Flex 4 portas",
     "url":"https://quitcar.com.br/carros/caoa-chery/tiggo-3x-pro-1-0-turbo-flex-aut-2/2022/1013137",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"094","id":"1010502","marca":"RAM","modelo":"RAM Rampage R/T 2025",
     "ano":"2025","km":"9709","preco":"219000","cor":"",
     "titulo":"RAM Rampage R/T HURRIC. 4 2.0 TB CD 4X4 Aut. Gasolina 4 portas",
     "url":"https://quitcar.com.br/carros/ram/rampage-r-t-hurric-4-2-0-tb-cd-4x4-aut/2025/1010502",
     "cambio":"Automatico","combustivel":"Gasolina"},
    {"n":"095","id":"1010644","marca":"RAM","modelo":"RAM Rampage R/T 2024",
     "ano":"2024","km":"44237","preco":"204980","cor":"",
     "titulo":"RAM Rampage R/T HURRIC. 4 2.0 TB CD 4X4 Aut. Gasolina 4 portas",
     "url":"https://quitcar.com.br/carros/ram/rampage-r-t-hurric-4-2-0-tb-cd-4x4-aut/2024/1010644",
     "cambio":"Automatico","combustivel":"Gasolina"},
    {"n":"096","id":"1010713","marca":"VolksWagen","modelo":"VolksWagen Virtus Comfortline",
     "ano":"2024","km":"83608","preco":"105980","cor":"",
     "titulo":"VolksWagen Virtus Comfort. 200 TSI 1.0 Flex 12V Aut. Flex 4 portas",
     "url":"https://quitcar.com.br/carros/vw-volkswagen/virtus-comfort-200-tsi-1-0-flex-12v-aut/2024/1010713",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"097","id":"1007646","marca":"Fiat","modelo":"Fiat Toro Freedom Road",
     "ano":"2018","km":"105000","preco":"86980","cor":"",
     "titulo":"Fiat Toro Freedom Road 2.4 16V Flex Aut. Flex 4 portas",
     "url":"https://quitcar.com.br/carros/fiat/toro-freedom-road-2-4-16v-flex-aut/2018/1007646",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"098","id":"1014007","marca":"Toyota","modelo":"Toyota Corolla XEi 2023",
     "ano":"2023","km":"76658","preco":"129980","cor":"",
     "titulo":"Toyota Corolla XEi 2.0 Flex 16V Aut. Flex 4 portas",
     "url":"https://quitcar.com.br/carros/toyota/corolla-xei-2-0-flex-16v-aut/2023/1014007",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"099","id":"694407","marca":"Toyota","modelo":"Toyota RAV4 Top",
     "ano":"2018","km":"86894","preco":"119980","cor":"",
     "titulo":"Toyota RAV4 2.0 Top 4x2 16V Aut. Gasolina 4 portas",
     "url":"https://quitcar.com.br/carros/toyota/rav4-2-0-top-4x2-16v-aut/2018/694407",
     "cambio":"Automatico","combustivel":"Gasolina"},
    {"n":"100","id":"1013115","marca":"Renault","modelo":"Renault Kwid Zen 2019",
     "ano":"2019","km":"126214","preco":"37980","cor":"",
     "titulo":"Renault Kwid Zen 1.0 Flex 12V 5p Mec. Flex 4 portas",
     "url":"https://quitcar.com.br/carros/renault/kwid-zen-1-0-flex-12v-5p-mec/2019/1013115",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"101","id":"1013044","marca":"Renault","modelo":"Renault OROCH Pro 2023",
     "ano":"2023","km":"42707","preco":"87980","cor":"",
     "titulo":"Renault OROCH Pro 1.6 Flex 16V Mec. Flex 4 portas",
     "url":"https://quitcar.com.br/carros/renault/oroch-pro-1-6-flex-16v-mec/2023/1013044",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"102","id":"1012932","marca":"Honda","modelo":"Honda HR-V EX Sensing",
     "ano":"2024","km":"40574","preco":"139980","cor":"",
     "titulo":"Honda HR-V EX 1.5 Sensing 16V 5p Aut. Flex 4 portas",
     "url":"https://quitcar.com.br/carros/honda/hr-v-ex-1-5-sensing-16v-5p-aut/2024/1012932",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"103","id":"1011587","marca":"Fiat","modelo":"Fiat MOBI Like 2024",
     "ano":"2024","km":"37979","preco":"56980","cor":"",
     "titulo":"Fiat MOBI Like 1.0 Fire Flex 5p Flex 4 portas",
     "url":"https://quitcar.com.br/carros/fiat/mobi-like-1-0-fire-flex-5p/2024/1011587",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"104","id":"1008974","marca":"Renault","modelo":"Renault CAPTUR Intense Bose",
     "ano":"2021","km":"55358","preco":"80980","cor":"",
     "titulo":"Renault CAPTUR Intense Bose 1.6 16V Flex 5p Aut. Flex 4 portas",
     "url":"https://quitcar.com.br/carros/renault/captur-intense-bose-1-6-16v-flex-5p-aut/2021/1008974",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"105","id":"1001798","marca":"Mitsubishi","modelo":"Mitsubishi L200 Triton Sport HPE",
     "ano":"2017","km":"182800","preco":"130980","cor":"",
     "titulo":"Mitsubishi L200 Triton Sport HPE 2.4 CD Diesel Aut. Diesel 4 portas",
     "url":"https://quitcar.com.br/carros/mitsubishi/l200-triton-sport-hpe-2-4-cd-diesel-aut/2017/1001798",
     "cambio":"Automatico","combustivel":"Diesel"},
]

# ---------- 23 carros VENDIDOS (saíram após 30/maio) ----------
VENDIDOS_IDS = {
    "1004425","986002","831455","328677","407990","961403","955115","987536",
    "919130","984832","984552","898434","961889","961893","968071","967600",
    "754429","654616","998788","991933","988952","988706","988743",
}

# ---------- Funções ----------
PHOTO_RE = re.compile(
    r"https://resized-images\.autoconf\.com\.br/[^\"'\s]+?/veiculos/fotos/(\d+)/[a-f0-9\-]+\.jpg",
    re.IGNORECASE
)

def fetch_photos(car):
    """Busca a página do carro e extrai as URLs únicas de foto."""
    try:
        r = requests.get(car["url"], headers=HEADERS, timeout=30)
        r.raise_for_status()
    except Exception as e:
        print(f"  ! Erro buscando {car['n']} {car['modelo']}: {e}")
        return []
    found = []
    seen = set()
    for m in PHOTO_RE.finditer(r.text):
        url = m.group(0)
        # normaliza para o tamanho 1000x750
        url = re.sub(r"/\d+x\d+/", "/1000x750/", url, count=1)
        if url not in seen:
            seen.add(url)
            found.append(url)
    return found

def slug_pasta(car):
    nome = f"{car['n']} - {car['modelo']} - {car['ano']}"
    # remove caracteres problemáticos
    nome = re.sub(r"[<>:\"/\\|?*]", "", nome)
    return nome

def baixar_foto(url, destino):
    try:
        r = requests.get(url, headers=HEADERS, timeout=60)
        r.raise_for_status()
        destino.write_bytes(r.content)
        return True
    except Exception as e:
        print(f"    ! Falha baixar {url}: {e}")
        return False

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

def fmt_km(km):
    n = int(km) if km else 0
    return f"{n:,} km".replace(",", ".")

def fmt_preco(p):
    n = float(p) if p else 0.0
    s = f"R$ {n:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
    return s

# ---------- Execução ----------
def main():
    BASE.mkdir(exist_ok=True)
    print(f"== Atualizando estoque Quitcar — {HOJE} ==\n")
    print(f"NOVOS: {len(NOVOS)} | VENDIDOS: {len(VENDIDOS_IDS)}\n")

    novos_processados = []
    for car in NOVOS:
        print(f"[{car['n']}] {car['modelo']} {car['ano']}  (id={car['id']})")
        pasta = BASE / slug_pasta(car)
        pasta.mkdir(exist_ok=True)
        fotos = fetch_photos(car)
        if not fotos:
            print("  (nenhuma foto encontrada — talvez página renderiza com JS)")
        baixadas = []
        for i, url in enumerate(fotos, 1):
            destino = pasta / f"foto_{i:02d}.jpg"
            if destino.exists() and destino.stat().st_size > 1024:
                baixadas.append(destino.name)
                continue
            ok = baixar_foto(url, destino)
            if ok:
                baixadas.append(destino.name)
                print(f"    + foto_{i:02d}.jpg ({len(destino.read_bytes())//1024} KB)")
            time.sleep(0.2)
        car["pasta"] = pasta.name
        car["pasta_path"] = str(pasta)
        car["qtd_fotos"] = len(baixadas)
        car["fotos"] = baixadas
        car["whatsapp_link"] = gerar_whatsapp(car["modelo"], car["ano"])
        car["whatsapp"] = WHATSAPP
        car["km_fmt"] = fmt_km(car["km"])
        car["preco_fmt"] = fmt_preco(car["preco"])
        novos_processados.append(car)
        print(f"  -> {len(baixadas)} fotos salvas em {pasta.name}\n")

    # Atualiza JSON consolidado
    json_old = BASE / "catalogo_carros.json"
    dados_antigos = json.loads(json_old.read_text(encoding="utf-8")) if json_old.exists() else []
    # Marca vendidos
    for d in dados_antigos:
        d["status"] = "VENDIDO" if d["id"] in VENDIDOS_IDS else "ATIVO"
    # Junta novos
    todos = dados_antigos + [
        {
            "n": c["n"], "id": c["id"], "marca": c["marca"], "modelo": c["modelo"],
            "modelo_ano": f"{c['modelo']} {c['ano']}", "titulo_completo": c["titulo"],
            "ano": c["ano"], "km": c["km"], "km_fmt": c["km_fmt"], "cor": c["cor"],
            "cambio": c["cambio"], "combustivel": c["combustivel"],
            "preco": f"{float(c['preco']):.2f}", "preco_fmt": c["preco_fmt"],
            "whatsapp": c["whatsapp"], "whatsapp_link": c["whatsapp_link"],
            "pasta": c["pasta"], "pasta_path": c["pasta_path"],
            "qtd_fotos": c["qtd_fotos"], "fotos": c["fotos"],
            "url_site": c["url"], "status": "ATIVO",
        }
        for c in novos_processados
    ]

    json_new = BASE / f"catalogo_carros_{HOJE}.json"
    json_new.write_text(json.dumps(todos, ensure_ascii=False, indent=2), encoding="utf-8")
    print(f"==> {json_new.name} salvo ({len(todos)} carros)")

    # CSV atualizado
    csv_new = BASE / f"catalogo_carros_{HOJE}.csv"
    campos = ["n","id","status","marca","modelo","modelo_ano","ano","km_fmt","cor",
              "cambio","combustivel","preco_fmt","whatsapp_link","qtd_fotos","pasta"]
    with csv_new.open("w", encoding="utf-8", newline="") as f:
        w = csv.DictWriter(f, fieldnames=campos, delimiter=";")
        w.writeheader()
        for d in todos:
            w.writerow({k: d.get(k, "") for k in campos})
    print(f"==> {csv_new.name} salvo")

    # Relatório
    ativos = [d for d in todos if d.get("status") == "ATIVO"]
    vendidos = [d for d in todos if d.get("status") == "VENDIDO"]
    novos = novos_processados

    relatorio = []
    relatorio.append(f"# RELATÓRIO DE ATUALIZAÇÃO — Estoque Quitcar")
    relatorio.append(f"**Data:** {HOJE}\n")
    relatorio.append("## Resumo")
    relatorio.append(f"- Estoque ANTERIOR: **88 carros** (snapshot de 30/maio/2026)")
    relatorio.append(f"- Estoque ATUAL no site: **82 carros**")
    relatorio.append(f"- VENDIDOS (saíram): **{len(vendidos)}**")
    relatorio.append(f"- NOVOS (entraram): **{len(novos)}**")
    relatorio.append(f"- Saldo: 88 − {len(vendidos)} + {len(novos)} = {88 - len(vendidos) + len(novos)}\n")
    relatorio.append("---\n")

    relatorio.append("## 🚗 CARROS VENDIDOS (saíram do estoque)\n")
    relatorio.append("| # | Pasta | Modelo | Ano | Preço | ID |")
    relatorio.append("|---|-------|--------|-----|-------|----|")
    for d in sorted(vendidos, key=lambda x: x.get("n","")):
        relatorio.append(
            f"| {d.get('n','')} | `{d.get('pasta','')}` | {d.get('modelo','')} "
            f"| {d.get('ano','')} | {d.get('preco_fmt','')} | {d.get('id','')} |"
        )

    relatorio.append("\n---\n")
    relatorio.append("## 🆕 CARROS NOVOS (entraram no estoque)\n")
    relatorio.append("| # | Pasta | Modelo | Ano | Km | Preço | Fotos | ID |")
    relatorio.append("|---|-------|--------|-----|-----|-------|-------|----|")
    for c in novos:
        relatorio.append(
            f"| {c['n']} | `{c['pasta']}` | {c['modelo']} | {c['ano']} "
            f"| {c['km_fmt']} | {c['preco_fmt']} | {c['qtd_fotos']} | {c['id']} |"
        )

    relatorio.append("\n---\n")
    relatorio.append(f"## ✅ ESTOQUE ATIVO COMPLETO ({len(ativos) + len(novos)} carros)\n")
    relatorio.append("| # | Modelo | Ano | Km | Preço | ID |")
    relatorio.append("|---|--------|-----|-----|-------|----|")
    for d in ativos + [
        {"n": c["n"], "modelo": c["modelo"], "ano": c["ano"], "km_fmt": c["km_fmt"],
         "preco_fmt": c["preco_fmt"], "id": c["id"]} for c in novos
    ]:
        relatorio.append(
            f"| {d.get('n','')} | {d.get('modelo','')} | {d.get('ano','')} "
            f"| {d.get('km_fmt','')} | {d.get('preco_fmt','')} | {d.get('id','')} |"
        )

    relatorio.append("\n---\n")
    relatorio.append("## 📞 Contato")
    relatorio.append(f"- WhatsApp: {WHATSAPP}")
    relatorio.append(f"- Site: https://quitcar.com.br/estoque\n")

    md = "\n".join(relatorio)
    rel = BASE / f"RELATORIO_ATUALIZACAO_{HOJE}.md"
    rel.write_text(md, encoding="utf-8")
    print(f"==> {rel.name} salvo")

    # Salva também no Obsidian Vault (preferência do usuário)
    try:
        OBSIDIAN.mkdir(parents=True, exist_ok=True)
        obs = OBSIDIAN / f"{HOJE} - Atualizacao Estoque Quitcar.md"
        obs.write_text(md, encoding="utf-8")
        print(f"==> Espelho no Obsidian: {obs}")
    except Exception as e:
        print(f"  ! Não consegui salvar no Obsidian: {e}")

    print("\n== FINALIZADO ==")
    print(f"Total ativos: {len(ativos) + len(novos)}")
    print(f"Total vendidos: {len(vendidos)}")
    print(f"Novos com fotos: {sum(1 for c in novos if c['qtd_fotos']>0)}/{len(novos)}")

if __name__ == "__main__":
    main()
