"""
Reprocessa os 17 carros NOVOS com Selenium (render JS) — 2026-05-31
- Extrai TODAS as fotos do ID correto (corrige fotos de carros relacionados)
- Extrai ficha técnica completa: cor, carroceria, portas, opcionais, garantia
- Detecta carros "Fotos em Breve" (sem fotos cadastradas)
- Regrava catalogo_carros_2026-05-31.csv/json + relatório
"""
import csv, json, os, re, time
from pathlib import Path
from urllib.parse import quote
import requests
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By

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"
WA_RAW = "5534996442431"
HDR = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0 Safari/537.36"}

CORES = ["Branco","Preto","Prata","Cinza","Vermelho","Azul","Verde","Marrom",
         "Bege","Amarelo","Dourado","Laranja","Vinho","Grafite"]
CARROCERIAS = ["SUV","Sedã","Sedan","Hatch","Picape","Pick-up","Perua","Utilitário",
               "Utilitario","Cupê","Coupé","Conversível","Minivan","Van","Furgão"]

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

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"}

# Foton V9 (id 1010465): JA estava na pasta 088 (lista fisica antiga), faltava no JSON.
# Carro MANTIDO no site (nao e novo). Processado para completar o catalogo.
EXTRAS = [
 {"n":"088","id":"1010465","marca":"FOTON","modelo":"Foton Tunland V9 4x4","ano":"2025","km":"5165","preco":"289000","cambio":"Automatico","combustivel":"Diesel","titulo":"FOTON TUNLAND V9 2.0 4x4 TB Diesel Aut. (Hibrido) Diesel 4 portas","url":"https://quitcar.com.br/carros/foton/tunland-v9-2-0-4x4-tb-diesel-aut-hib/2026/1010465"},
]

def slug(c):
    nome=f"{c['n']} - {c['modelo']} - {c['ano']}"
    return re.sub(r'[<>:\"/\\|?*]','',nome)

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

def fmt_preco(p):
    return f"R$ {float(p):,.2f}".replace(",","X").replace(".",",").replace("X",".")

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

def parse_ficha(body, car):
    """Extrai cor, portas, carroceria e opcionais do texto renderizado."""
    out={"cor":"","portas":"","carroceria":"","opcionais":[],"garantia":"","fotos_em_breve":"Fotos em Breve" in body or "Fotos em breve" in body}
    # bloco ficha
    i=body.find("FICHA")
    j=body.find("OPCIONAIS")
    g=body.find("GARANTIA")
    fim_ficha = j if j>0 else (g if g>0 else i+400)
    ficha = body[i:fim_ficha] if i>=0 else ""
    for ln in [l.strip() for l in ficha.splitlines() if l.strip()]:
        if not out["cor"] and ln in CORES: out["cor"]=ln
        m=re.match(r'(\d+)\s*portas', ln)
        if m and not out["portas"]: out["portas"]=m.group(1)
        for cb in CARROCERIAS:
            if cb.lower() in ln.lower() and not out["carroceria"]:
                out["carroceria"]=ln; break
    # opcionais
    if j>0:
        fim_op = g if g>0 else (body.find("+ INFOR") if body.find("+ INFOR")>0 else j+600)
        bloco=body[j+len("OPCIONAIS"):fim_op]
        out["opcionais"]=[l.strip() for l in bloco.splitlines() if l.strip()]
    # garantia
    if g>0:
        fim_g=body.find("+ INFOR")
        bloco=body[g+len("GARANTIA"):fim_g if fim_g>0 else g+200]
        gar=[l.strip() for l in bloco.splitlines() if l.strip()]
        out["garantia"]=" ".join(gar)[:120]
    return out

def main():
    opts=Options()
    for a in ['--headless=new','--disable-gpu','--no-sandbox','--window-size=1400,1200','--log-level=3']:
        opts.add_argument(a)
    d=webdriver.Edge(options=opts); d.set_page_load_timeout(60)
    processados=[]
    sem_foto=[]
    fila = EXTRAS + NOVOS  # 088 (mantido) + 089-105 (novos)
    print(f"== Reprocessando {len(NOVOS)} novos + {len(EXTRAS)} mantido via Selenium ==\n")
    for c in fila:
        print(f"[{c['n']}] {c['modelo']} {c['ano']} (id={c['id']})")
        try:
            d.get(c["url"]); time.sleep(3.5)
            d.execute_script("window.scrollTo(0,500)"); time.sleep(1.2)
            d.execute_script("window.scrollTo(0,1100)"); time.sleep(1.2)
            html=d.page_source
            body=d.find_element(By.TAG_NAME,"body").text
        except Exception as e:
            print("  ! erro render:",str(e)[:80]); continue
        # fotos SO do proprio id -> dedupe por UUID, monta 1000x750 jpg
        uuids=[]
        seen=set()
        for m in re.finditer(rf'/veiculos/fotos/{c["id"]}/([a-f0-9\-]{{12,}})\.', html):
            u=m.group(1)
            if u not in seen: seen.add(u); uuids.append(u)
        ficha=parse_ficha(body,c)
        pasta=BASE/slug(c); pasta.mkdir(exist_ok=True)
        # limpa fotos antigas (podem estar erradas)
        for f in pasta.glob("foto_*.jpg"): f.unlink()
        baixadas=[]
        for i,u in enumerate(uuids,1):
            url=f"https://resized-images.autoconf.com.br/1000x750/filters:format(jpg)/veiculos/fotos/{c['id']}/{u}.jpg"
            try:
                r=requests.get(url,headers=HDR,timeout=60); r.raise_for_status()
                (pasta/f"foto_{i:02d}.jpg").write_bytes(r.content); baixadas.append(f"foto_{i:02d}.jpg")
            except Exception as e:
                print("    ! falha",u[:8],str(e)[:40])
            time.sleep(0.15)
        c.update({
            "cor":ficha["cor"],"carroceria":ficha["carroceria"],"portas":ficha["portas"],
            "opcionais":ficha["opcionais"],"garantia":ficha["garantia"],
            "fotos_em_breve":ficha["fotos_em_breve"],
            "pasta":pasta.name,"pasta_path":str(pasta),"qtd_fotos":len(baixadas),"fotos":baixadas,
            "km_fmt":fmt_km(c["km"]),"preco_fmt":fmt_preco(c["preco"]),
            "whatsapp":WHATSAPP,"whatsapp_link":wa_link(c["modelo"],c["ano"]),
        })
        processados.append(c)
        tag=" [FOTOS EM BREVE]" if ficha["fotos_em_breve"] else ""
        print(f"  -> {len(baixadas)} fotos | cor={ficha['cor'] or '?'} | {ficha['carroceria'] or '?'} | {len(ficha['opcionais'])} opcionais{tag}\n")
        if len(baixadas)==0: sem_foto.append(c)
    d.quit()

    # ---- regrava catalogos ----
    json_old=BASE/"catalogo_carros.json"
    antigos=json.loads(json_old.read_text(encoding="utf-8")) if json_old.exists() else []
    for x in antigos: x["status"]="VENDIDO" if x["id"] in VENDIDOS_IDS else "ATIVO"
    novos_json=[{
        "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"],
        "carroceria":c["carroceria"],"portas":c["portas"],"opcionais":c["opcionais"],
        "garantia":c["garantia"],"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"],
        "fotos_em_breve":c["fotos_em_breve"],"status":"ATIVO",
    } for c in processados]
    todos=antigos+novos_json
    (BASE/f"catalogo_carros_{HOJE}.json").write_text(json.dumps(todos,ensure_ascii=False,indent=2),encoding="utf-8")
    print(f"==> catalogo_carros_{HOJE}.json ({len(todos)} carros)")

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

    # ---- relatorio ----
    # separa os realmente NOVOS (n>=089) dos MANTIDOS que faltavam no JSON (088)
    novos_reais=[c for c in processados if c["n"]>="089"]
    mantidos_extra=[c for c in processados if c["n"]<"089"]
    vendidos=[x for x in todos if x.get("status")=="VENDIDO"]
    ativos_old=[x for x in antigos if x.get("status")=="ATIVO"]
    R=[]
    R.append(f"# RELATÓRIO DE ATUALIZAÇÃO — Estoque Quitcar")
    R.append(f"**Data:** {HOJE}  ·  **Fonte:** https://quitcar.com.br/estoque\n")
    R.append("## Resumo")
    R.append(f"- Estoque anterior (30/mai): **88 carros**")
    R.append(f"- Estoque atual no site: **82 carros**")
    R.append(f"- 🔴 Vendidos (saíram): **{len(vendidos)}**")
    R.append(f"- 🆕 Novos (entraram): **{len(novos_reais)}**")
    nb=[c for c in novos_reais if c['fotos_em_breve'] or c['qtd_fotos']==0]
    R.append(f"- ⚠️ Novos sem fotos no site (\"Fotos em Breve\"): **{len(nb)}**")
    if mantidos_extra:
        R.append(f"- ℹ️ Correção: {len(mantidos_extra)} carro já no estoque físico (pasta 088 Foton V9) faltava no catálogo JSON — agora incluído.")
    R.append("")
    R.append("---\n")
    R.append("## 🔴 VENDIDOS (saíram do estoque)\n")
    R.append("| # | Modelo | Ano | Preço | ID |")
    R.append("|---|--------|-----|-------|----|")
    for x in sorted(vendidos,key=lambda v:v.get("n","")):
        R.append(f"| {x.get('n','')} | {x.get('modelo','')} | {x.get('ano','')} | {x.get('preco_fmt','')} | {x.get('id','')} |")
    R.append("\n---\n")
    R.append("## 🆕 NOVOS (entraram) — com fotos e ficha completa\n")
    R.append("| # | Modelo | Ano | Km | Cor | Carroceria | Preço | Fotos | Pasta |")
    R.append("|---|--------|-----|-----|-----|-----------|-------|-------|-------|")
    for c in novos_reais:
        fotos=f"{c['qtd_fotos']}" if c['qtd_fotos'] else "⚠️ em breve"
        R.append(f"| {c['n']} | {c['modelo']} | {c['ano']} | {c['km_fmt']} | {c['cor'] or '—'} | {c['carroceria'] or '—'} | {c['preco_fmt']} | {fotos} | `{c['pasta']}` |")
    if nb:
        R.append("\n> **Atenção:** os carros marcados \"em breve\" ainda não têm fotos publicadas no site da Quitcar. As pastas foram criadas com a ficha técnica; as fotos precisam ser tiradas/adicionadas antes de postar.")
    R.append("\n---\n")
    R.append(f"## ✅ ESTOQUE ATIVO COMPLETO ({len(ativos_old)+len(processados)} carros)\n")
    R.append("| # | Modelo | Ano | Km | Preço | ID |")
    R.append("|---|--------|-----|-----|-------|----|")
    for c in mantidos_extra:
        R.append(f"| {c['n']} | {c['modelo']} | {c['ano']} | {c['km_fmt']} | {c['preco_fmt']} | {c['id']} |")
    for x in ativos_old:
        R.append(f"| {x.get('n','')} | {x.get('modelo','')} | {x.get('ano','')} | {x.get('km_fmt','')} | {x.get('preco_fmt','')} | {x.get('id','')} |")
    for c in novos_reais:
        R.append(f"| {c['n']} | {c['modelo']} | {c['ano']} | {c['km_fmt']} | {c['preco_fmt']} | {c['id']} |")
    R.append(f"\n---\n## 📞 Contato\n- WhatsApp: {WHATSAPP}\n- Site: https://quitcar.com.br/estoque\n")
    md="\n".join(R)
    (BASE/f"RELATORIO_ATUALIZACAO_{HOJE}.md").write_text(md,encoding="utf-8")
    print(f"==> RELATORIO_ATUALIZACAO_{HOJE}.md")
    try:
        OBSIDIAN.mkdir(parents=True,exist_ok=True)
        (OBSIDIAN/f"{HOJE} - Atualizacao Estoque Quitcar.md").write_text(md,encoding="utf-8")
        print("==> Obsidian espelhado")
    except Exception as e:
        print("  ! obsidian:",str(e)[:60])

    print("\n== FIM ==")
    print(f"Novos COM fotos: {sum(1 for c in processados if c['qtd_fotos']>0)}/{len(processados)}")
    if nb:
        print("Sem fotos (em breve):", ", ".join(f"{c['n']} {c['modelo']}" for c in nb))

if __name__=="__main__":
    main()
