"""
Snapshot inicial do estoque Up Motors Uberlandia — 2026-05-31
- Baixa fotos dos 40 veiculos do site https://upmotorsudi.com.br/estoque
- Gera pasta NNN - Marca Modelo - Ano com fotos + .docx
- Gera catalogo_carros, catalogo_commerce_manager, catalogo_whatsapp, veiculos.json,
  posts_carros_instagram.md, RELATORIO_ATUALIZACAO_2026-05-31.md
- Mesma estrutura usada para Quitcar e Milani
"""
import csv
import json
import os
import re
import sys
import time
from pathlib import Path
from urllib.parse import quote

import requests
from docx import Document

BASE = Path(r"C:\Users\P7530\Downloads\up motors estoque")
OBSIDIAN = Path(r"C:\Users\P7530\Documents\Obsidian Vault\Up Motors")
HOJE = "2026-05-31"
WHATSAPP = "(34) 99644-2431"
WHATSAPP_RAW = "5534996442431"
LOJA = "Up Motors Uberlandia"
SITE = "https://upmotorsudi.com.br/estoque"

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

# ---------- 40 veiculos do estoque atual ----------
CARROS = [
    {"n":"001","id":"1014823","marca":"VolksWagen","modelo":"VolksWagen VIRTUS Exclusive 250TSI",
     "ano":"2024/2025","km":"38081","preco":"128890","cor":"",
     "titulo":"VolksWagen VIRTUS Exclusive 250TSI 1.4 Flex 16V Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/vw-volkswagen/virtus-exclusive-250tsi-1-4-flex-16v-aut/2025/1014823",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"002","id":"1014052","marca":"Fiat","modelo":"Fiat Toro Freedom Diesel",
     "ano":"2019/2020","km":"109573","preco":"97890","cor":"",
     "titulo":"Fiat Toro Freedom 2.0 16V 4x4 TB Diesel Aut. Diesel 4 portas",
     "url":"https://upmotorsudi.com.br/carros/fiat/toro-freedom-2-0-16v-4x4-diesel-aut/2020/1014052",
     "cambio":"Automatico","combustivel":"Diesel"},
    {"n":"003","id":"1005943","marca":"Hyundai","modelo":"Hyundai HB20 Limited 1.0",
     "ano":"2023/2024","km":"54304","preco":"72890","cor":"",
     "titulo":"Hyundai HB20 Limited 1.0 Flex 12V Mec. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/hyundai/hb20-limited-1-0-flex-12v-mec/2024/1005943",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"004","id":"1013340","marca":"Jeep","modelo":"Jeep Renegade Sport 1.8",
     "ano":"2018/2019","km":"87453","preco":"69890","cor":"",
     "titulo":"Jeep Renegade Sport 1.8 4x2 Flex 16V Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/jeep/renegade-sport-1-8-4x2-flex-16v-aut/2019/1013340",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"005","id":"484545","marca":"Renault","modelo":"Renault LOGAN Zen 1.0",
     "ano":"2022/2023","km":"75611","preco":"56890","cor":"",
     "titulo":"Renault LOGAN Zen Flex 1.0 12V 4p Mec. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/renault/logan-zen-flex-1-0-12v-4p-mec/2023/484545",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"006","id":"1012915","marca":"VolksWagen","modelo":"VolksWagen Nivus Highline 200 TSI",
     "ano":"2022/2022","km":"57309","preco":"110890","cor":"",
     "titulo":"VolksWagen Nivus Highline 1.0 200 TSI Flex Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/vw-volkswagen/nivus-highline-1-0-200-tsi-flex-aut/2022/1012915",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"007","id":"940467","marca":"Jeep","modelo":"Jeep COMPASS Longitude Diesel 4x4",
     "ano":"2021/2022","km":"70000","preco":"124890","cor":"",
     "titulo":"Jeep COMPASS Longitude TD 350 2.0 4x4 Diesel Aut. Diesel 4 portas",
     "url":"https://upmotorsudi.com.br/carros/jeep/compass-long-td-350-2-0-4x4-diesel-aut/2022/940467",
     "cambio":"Automatico","combustivel":"Diesel"},
    {"n":"008","id":"1003057","marca":"Honda","modelo":"Honda HR-V LX 1.8",
     "ano":"2016/2016","km":"97939","preco":"83000","cor":"",
     "titulo":"Honda HR-V LX 1.8 Flexone 16V 5p Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/honda/hr-v-lx-1-8-flexone-16v-5p-aut/2016/1003057",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"009","id":"1011367","marca":"VolksWagen","modelo":"VolksWagen Polo 1.0",
     "ano":"2021/2021","km":"78770","preco":"66890","cor":"",
     "titulo":"VolksWagen Polo 1.0 Flex 12V 5p Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/vw-volkswagen/polo-1-0-flex-12v-5p/2021/1011367",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"010","id":"1009676","marca":"Ford","modelo":"Ford KA 1.5 SE Plus",
     "ano":"2019/2019","km":"79001","preco":"51890","cor":"",
     "titulo":"Ford KA 1.5 SE Plus 12V Flex 5p Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/ford/ka-1-5-se-plus-12v-flex-5p-aut/2019/1009676",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"011","id":"1010759","marca":"Hyundai","modelo":"Hyundai HB20S C.Style 1.6",
     "ano":"2019/2019","km":"90707","preco":"71890","cor":"",
     "titulo":"Hyundai HB20S C.Style/C.Plus 1.6 Flex 16V Aut. 4p Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/hyundai/hb20s-c-style-c-plus1-6-flex-16v-aut-4p/2019/1010759",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"012","id":"1009289","marca":"Fiat","modelo":"Fiat Toro Volcano Diesel",
     "ano":"2022/2023","km":"73651","preco":"129890","cor":"",
     "titulo":"Fiat Toro Volcano 2.0 16V 4x4 TB Diesel Aut. Diesel 4 portas",
     "url":"https://upmotorsudi.com.br/carros/fiat/toro-volcano-2-0-16v-4x4-tb-diesel-aut/2023/1009289",
     "cambio":"Automatico","combustivel":"Diesel"},
    {"n":"013","id":"1005443","marca":"VolksWagen","modelo":"VolksWagen Polo Comfortline 200 TSI",
     "ano":"2018/2018","km":"115626","preco":"71890","cor":"",
     "titulo":"VolksWagen Polo Comfort. 200 TSI 1.0 Flex 12V Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/vw-volkswagen/polo-comfort-200-tsi-1-0-flex-12v-aut/2018/1005443",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"014","id":"994229","marca":"Chevrolet","modelo":"Chevrolet ONIX HATCH Joy 1.0",
     "ano":"2018/2019","km":"94337","preco":"52890","cor":"",
     "titulo":"Chevrolet ONIX HATCH Joy 1.0 8V Flex 5p Mec. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/gm-chevrolet/onix-hatch-joy-1-0-8v-flex-5p-mec/2019/994229",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"015","id":"1006927","marca":"Fiat","modelo":"Fiat Strada Volcano 1.3 CD",
     "ano":"2023/2023","km":"45543","preco":"112890","cor":"",
     "titulo":"Fiat Strada Volcano 1.3 Flex 8V CD Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/fiat/strada-volcano-1-3-flex-8v-cd-aut/2023/1006927",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"016","id":"1001701","marca":"VolksWagen","modelo":"VolksWagen VOYAGE 1.6 MSI",
     "ano":"2021/2022","km":"64390","preco":"61890","cor":"",
     "titulo":"VolksWagen VOYAGE 1.6 MSI Flex 8V 4p Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/vw-volkswagen/voyage-1-6-msi-flex-8v-4p/2022/1001701",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"017","id":"989804","marca":"Fiat","modelo":"Fiat PULSE AUDACE Turbo",
     "ano":"2024/2024","km":"56463","preco":"95890","cor":"",
     "titulo":"Fiat PULSE AUDACE 1.0 Turbo 200 Flex Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/fiat/pulse-audace-1-0-turbo-200-flex-aut/2024/989804",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"018","id":"971689","marca":"VolksWagen","modelo":"VolksWagen Gol 1.0",
     "ano":"2022/2023","km":"47413","preco":"54890","cor":"",
     "titulo":"VolksWagen Gol 1.0 Flex 12V 5p Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/vw-volkswagen/gol-1-0-flex-12v-5p/2023/971689",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"019","id":"996751","marca":"Kia Motors","modelo":"Kia Sorento 2.4 4x2",
     "ano":"2011/2012","km":"142346","preco":"55890","cor":"",
     "titulo":"Kia Sorento 2.4 16V 4x2 Aut. Gasolina 4 portas",
     "url":"https://upmotorsudi.com.br/carros/kia-motors/sorento-2-4-16v-4x2-aut/2012/996751",
     "cambio":"Automatico","combustivel":"Gasolina"},
    {"n":"020","id":"994532","marca":"Jeep","modelo":"Jeep COMPASS Sport 2.0 4x4",
     "ano":"2018/2018","km":"101531","preco":"86890","cor":"",
     "titulo":"Jeep COMPASS Sport 2.0 4x4 Flex 16V Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/jeep/compass-sport-2-0-4x4-flex-16v-aut/2018/994532",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"021","id":"991409","marca":"Honda","modelo":"Honda BIZ 125 EX (Moto)",
     "ano":"2013/2013","km":"32800","preco":"11890","cor":"",
     "titulo":"Honda BIZ 125 EX/ 125 EX FLEX Flex 2 rodas",
     "url":"https://upmotorsudi.com.br/motos/honda-1/biz-125-ex-125-ex-flex/2013/991409",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"022","id":"997366","marca":"Hyundai","modelo":"Hyundai Creta Action 1.6",
     "ano":"2021/2022","km":"74145","preco":"91890","cor":"",
     "titulo":"Hyundai Creta Action 1.6 16V Flex Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/hyundai/creta-action-1-6-16v-flex-aut/2022/997366",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"023","id":"974467","marca":"Chevrolet","modelo":"Chevrolet Classic 1.0",
     "ano":"2015/2016","km":"139024","preco":"36890","cor":"",
     "titulo":"Chevrolet Classic Life/LS 1.0 VHC FlexP. 4p Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/gm-chevrolet/classic-life-ls-1-0-vhc-flexp-4p/2016/974467",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"024","id":"991949","marca":"Mitsubishi","modelo":"Mitsubishi L200 Triton HPE-S Diesel",
     "ano":"2023/2024","km":"103187","preco":"199890","cor":"",
     "titulo":"Mitsubishi L200 Triton Sport HPE-S 2.4 CD Diesel Aut. Diesel 4 portas",
     "url":"https://upmotorsudi.com.br/carros/mitsubishi/l200-triton-sport-hpe-s-2-4-cd-dies-aut/2024/991949",
     "cambio":"Automatico","combustivel":"Diesel"},
    {"n":"025","id":"990767","marca":"Chevrolet","modelo":"Chevrolet ONIX HATCH 1.0",
     "ano":"2023/2024","km":"38342","preco":"70890","cor":"",
     "titulo":"Chevrolet ONIX HATCH 1.0 12V Flex 5p Mec. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/gm-chevrolet/onix-hatch-1-0-12v-flex-5p-mec/2024/990767",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"026","id":"974471","marca":"Fiat","modelo":"Fiat PULSE Drive Turbo",
     "ano":"2022/2022","km":"72514","preco":"88890","cor":"",
     "titulo":"Fiat PULSE Drive 1.0 Turbo 200 Flex Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/fiat/pulse-drive-1-0-turbo-200-flex-aut/2022/974471",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"027","id":"985970","marca":"Jeep","modelo":"Jeep Renegade Longitude T270",
     "ano":"2024/2025","km":"17400","preco":"112890","cor":"",
     "titulo":"Jeep Renegade Long. T270 1.3 TB 4x2 Flex Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/jeep/renegade-long-t270-1-3-tb-4x2-flex-aut/2025/985970",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"028","id":"979269","marca":"Chevrolet","modelo":"Chevrolet TRACKER Premier Turbo",
     "ano":"2021/2022","km":"0","preco":"98890","cor":"",
     "titulo":"Chevrolet TRACKER Premier 1.2 Turbo 12V Flex Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/gm-chevrolet/tracker-premier-1-2-turbo-12v-flex-aut/2022/979269",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"029","id":"958398","marca":"Citroen","modelo":"Citroen BASALT Feel Turbo",
     "ano":"2024/2025","km":"77994","preco":"95890","cor":"",
     "titulo":"Citroen BASALT Feel 1.0 Flex TB 200 5p Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/citroen/basalt-feel-1-0-flex-tb-200-5p-aut/2025/958398",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"030","id":"977567","marca":"BMW","modelo":"BMW X1 sDrive 20i",
     "ano":"2019/2020","km":"65362","preco":"147890","cor":"",
     "titulo":"BMW X1 SDRIVE 20i 2.0/2.0 TB Acti.Flex Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/bmw/x1-sdrive-20i-2-0-2-0-tb-acti-flex-aut/2020/977567",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"031","id":"976098","marca":"BMW","modelo":"BMW 320iA M Sport",
     "ano":"2018/2018","km":"84681","preco":"129890","cor":"",
     "titulo":"BMW 320iA 2.0 TB M Sport A.Flex/M.Sport 4p Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/bmw/320ia-2-0-tb-m-sport-activeflex-16v-4p/2018/976098",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"032","id":"968564","marca":"Honda","modelo":"Honda Civic Sedan LXS",
     "ano":"2015/2016","km":"132592","preco":"74890","cor":"",
     "titulo":"Honda Civic Sedan LXS 1.8/1.8 Flex 16V Aut. 4p Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/honda/civic-sedan-lxs-1-8-1-8-flex-16v-aut-4p/2016/968564",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"033","id":"964092","marca":"Fiat","modelo":"Fiat Strada Volcano CD",
     "ano":"2023/2023","km":"85698","preco":"109890","cor":"",
     "titulo":"Fiat Strada Volcano 1.3 Flex 8V CD Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/fiat/strada-volcano-1-3-flex-8v-cd/2023/964092",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"034","id":"964696","marca":"Jeep","modelo":"Jeep Renegade Longitude T270",
     "ano":"2022/2023","km":"128099","preco":"95890","cor":"",
     "titulo":"Jeep Renegade Long. T270 1.3 TB 4x2 Flex Aut. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/jeep/renegade-long-t270-1-3-tb-4x2-flex-aut/2023/964696",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"035","id":"908683","marca":"Fiat","modelo":"Fiat Toro Volcano 4x4 Diesel",
     "ano":"2017/2018","km":"129465","preco":"98890","cor":"",
     "titulo":"Fiat Toro Volcano 2.0 16V 4x4 TB Diesel Aut. Diesel 4 portas",
     "url":"https://upmotorsudi.com.br/carros/fiat/toro-volcano-2-0-16v-4x4-tb-diesel-aut/2018/908683",
     "cambio":"Automatico","combustivel":"Diesel"},
    {"n":"036","id":"938586","marca":"VolksWagen","modelo":"VolksWagen T-Cross Highline 250 TSI",
     "ano":"2024/2025","km":"33949","preco":"151890","cor":"",
     "titulo":"VolksWagen T-Cross Hig. 250 TSI 1.4 Flex 16V 5p Aut Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/vw-volkswagen/t-cross-highline-1-4-tsi-flex-16v-5p-aut/2025/938586",
     "cambio":"Automatico","combustivel":"Flex"},
    {"n":"037","id":"916778","marca":"Hyundai","modelo":"Hyundai Creta Pulse 1.6",
     "ano":"2017/2018","km":"98659","preco":"79890","cor":"",
     "titulo":"Hyundai Creta Pulse 1.6 16V Flex Mec. Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/hyundai/creta-pulse-1-6-16v-flex-mec/2018/916778",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"038","id":"608454","marca":"VolksWagen","modelo":"VolksWagen up! cross 1.0",
     "ano":"2014/2015","km":"141218","preco":"48890","cor":"",
     "titulo":"VolksWagen up! cross 1.0 T. Flex 12V 5p Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/vw-volkswagen/up-cross-1-0-t-flex-12v-5p/2015/608454",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"039","id":"871311","marca":"VolksWagen","modelo":"VolksWagen Fox Highline 1.6",
     "ano":"2015/2016","km":"167357","preco":"53890","cor":"",
     "titulo":"VolksWagen Fox Highline 1.6 Flex 16V 5p Flex 4 portas",
     "url":"https://upmotorsudi.com.br/carros/vw-volkswagen/fox-highline1-6-flex-16v-5p/2016/871311",
     "cambio":"Manual","combustivel":"Flex"},
    {"n":"040","id":"826090","marca":"VolksWagen","modelo":"VolksWagen Fusca 1300 (Classico)",
     "ano":"1973","km":"60000","preco":"49890","cor":"",
     "titulo":"VolksWagen Fusca 1300 Gasolina 2 portas",
     "url":"https://upmotorsudi.com.br/carros/vw-volkswagen/fusca-1300/1973/826090",
     "cambio":"Manual","combustivel":"Gasolina"},
]

# ---------- Funcoes ----------
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):
    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)
        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'].split('/')[-1]}"
    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

def docx_titulo_arquivo(car):
    base = f"{car['marca']} {car['modelo'].replace(car['marca'],'').strip()} {car['ano'].split('/')[-1]}"
    base = re.sub(r"[<>:\"/\\|?*()]", "", base).strip()
    base = re.sub(r"\s+", " ", base)
    return base + ".docx"

def gerar_docx(car, pasta):
    d = Document()
    d.add_paragraph(f"✅ {car['titulo']}")
    d.add_paragraph(f"Ano: {car['ano']}")
    d.add_paragraph(f"KM: {car['km']}")
    d.add_paragraph(f"Cambio: {car['cambio']}")
    d.add_paragraph(f"Combustivel: {car['combustivel']}")
    d.add_paragraph(f"Cor: {car['cor']}")
    d.add_paragraph(f"Preco: R$ {car['preco']}")
    arq = pasta / docx_titulo_arquivo(car)
    d.save(arq)
    return arq.name

# ---------- Execucao ----------
def main():
    BASE.mkdir(parents=True, exist_ok=True)
    print(f"== Snapshot estoque {LOJA} -- {HOJE} ==\n")
    print(f"Total: {len(CARROS)} veiculos\n")

    processados = []
    for car in CARROS:
        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)
        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
            if baixar_foto(url, destino):
                baixadas.append(destino.name)
                print(f"    + foto_{i:02d}.jpg ({len(destino.read_bytes())//1024} KB)")
            time.sleep(0.1)
        # docx
        docx_name = gerar_docx(car, pasta)
        car["pasta"] = pasta.name
        car["pasta_path"] = str(pasta)
        car["qtd_fotos"] = len(baixadas)
        car["fotos_arquivos"] = baixadas
        car["fotos_urls"] = fotos
        car["docx"] = docx_name
        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"])
        processados.append(car)
        print(f"  -> {len(baixadas)} fotos + {docx_name}\n")

    # veiculos.json (formato simples — igual Quitcar)
    veic_simples = [
        {
            "id": c["id"], "url": c["url"], "titulo": c["titulo"], "cor": c["cor"],
            "preco": f"{float(c['preco']):.2f}", "ano": c["ano"], "km": c["km"],
            "cambio": c["cambio"], "combustivel": c["combustivel"],
            "fotos": c["fotos_urls"],
        } for c in processados
    ]
    (BASE / "veiculos.json").write_text(
        json.dumps(veic_simples, ensure_ascii=False, indent=2), encoding="utf-8"
    )
    print(f"==> veiculos.json salvo ({len(veic_simples)} veiculos)")

    # catalogo_carros json detalhado
    todos = [
        {
            "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_arquivos"],
            "url_site": c["url"], "status": "ATIVO",
        } for c in processados
    ]
    (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 salvo")

    # CSV catalogo
    campos = ["n","id","status","marca","modelo","modelo_ano","ano","km_fmt","cor",
              "cambio","combustivel","preco_fmt","whatsapp_link","qtd_fotos","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 d in todos:
            w.writerow({k: d.get(k, "") for k in campos})
    print(f"==> catalogo_carros_{HOJE}.csv salvo")

    # Facebook Commerce Manager CSV
    fb_campos = ["id","title","description","availability","condition","price","link","image_link","brand"]
    with (BASE / "catalogo_commerce_manager.csv").open("w", encoding="utf-8", newline="") as f:
        w = csv.DictWriter(f, fieldnames=fb_campos)
        w.writeheader()
        for c in processados:
            primeira = c["fotos_urls"][0] if c["fotos_urls"] else ""
            cond = "new" if int(c["km"] or 0) == 0 else "used"
            w.writerow({
                "id": c["id"],
                "title": f"{c['marca']} {c['modelo'].replace(c['marca'],'').strip()}",
                "description": f"Ano {c['ano']} | {c['km_fmt']} | {c['cambio']} | {c['combustivel']}",
                "availability": "in stock",
                "condition": cond,
                "price": f"{float(c['preco']):.2f} BRL",
                "link": c["url"],
                "image_link": primeira,
                "brand": c["marca"].capitalize(),
            })
    print("==> catalogo_commerce_manager.csv salvo")

    # WhatsApp CSV
    wa_campos = ["id","title","description","availability","price","image_link","link"]
    with (BASE / "catalogo_whatsapp.csv").open("w", encoding="utf-8", newline="") as f:
        w = csv.DictWriter(f, fieldnames=wa_campos, quoting=csv.QUOTE_ALL)
        w.writeheader()
        for c in processados:
            primeira = c["fotos_urls"][0] if c["fotos_urls"] else ""
            w.writerow({
                "id": c["id"],
                "title": f"{c['marca']} {c['modelo'].replace(c['marca'],'').strip()}",
                "description": f"Ano {c['ano']} | {c['km_fmt']} | {c['cambio']} | {c['combustivel']}",
                "availability": "in stock",
                "price": c["preco_fmt"],
                "image_link": primeira,
                "link": c["url"],
            })
    print("==> catalogo_whatsapp.csv salvo")

    # posts_carros_instagram.md
    posts = []
    posts.append("# Posts para Instagram — Up Motors Uberlandia\n")
    posts.append(f"**Vendedor:** Rafael  |  **WhatsApp:** {WHATSAPP}  |  **Local:** Uberlandia/MG\n")
    posts.append("Cada carro abaixo tem: legenda pronta para copiar/colar, link de WhatsApp exclusivo (ja menciona o modelo) e a pasta com as fotos.\n")
    com_fotos = sum(1 for c in processados if c["qtd_fotos"] > 0)
    sem_fotos = len(processados) - com_fotos
    posts.append(f"- **Total de veiculos:** {len(processados)}  ({com_fotos} com fotos, {sem_fotos} sem fotos)\n")
    posts.append("---\n")
    for c in processados:
        ano_curto = c["ano"].split("/")[-1]
        marca_tag = re.sub(r"[^A-Za-z0-9]", "", c["marca"])
        modelo_tag = re.sub(r"[^A-Za-z0-9]", "", c["modelo"].replace(c["marca"],"").strip())
        descritivo = "0 km, modelo novo na garantia de fabrica e pronto pra sair rodando." if int(c["km"] or 0) == 0 else f"Carro revisado, com {c['km_fmt']} rodados e pronto pra rodar."
        legenda = (
            f"\U0001f697 {c['marca']} {c['modelo'].replace(c['marca'],'').strip()} — {c['ano']}\n"
            f"\U0001f4cb {c['cor'] or 'Cor: consulte'} • {c['km_fmt']} • {c['cambio']} • {c['combustivel']}\n\n"
            f"{descritivo}\n\n"
            f"\U0001f4b0 {c['preco_fmt']}\n"
            f"\U0001f4f2 Fale com o Rafael no WhatsApp: {WHATSAPP}\n"
            f"\U0001f449 {c['whatsapp_link']}\n"
            f"\U0001f4cd Uberlandia/MG — agende sua visita ou test drive!\n\n"
            f"#carrosuberlandia #uberlandia #uberlandiamg #carros #seminovos #carrosusados #{marca_tag} #{marca_tag}{modelo_tag} #upmotors #financiamento #trocacomtroco"
        )
        posts.append(f"## {c['n']} — {c['modelo']} ({ano_curto})\n")
        posts.append("**Legenda (copiar e colar):**\n")
        posts.append("```")
        posts.append(legenda)
        posts.append("```\n")
        posts.append(f"- **Link WhatsApp:** {c['whatsapp_link']}")
        posts.append(f"- **Fotos:** {c['qtd_fotos']} na pasta `{c['pasta']}`\n")
    (BASE / "posts_carros_instagram.md").write_text("\n".join(posts), encoding="utf-8")
    print("==> posts_carros_instagram.md salvo")

    # Relatorio Markdown
    relatorio = []
    relatorio.append(f"# RELATORIO DE ATUALIZACAO — Estoque {LOJA}")
    relatorio.append(f"**Data:** {HOJE}\n")
    relatorio.append("## Resumo")
    relatorio.append(f"- Snapshot inicial do estoque Up Motors")
    relatorio.append(f"- Total de veiculos: **{len(processados)}** (39 carros + 1 moto)")
    com = sum(1 for c in processados if c["qtd_fotos"] > 0)
    relatorio.append(f"- Veiculos com fotos baixadas: **{com}**")
    relatorio.append(f"- Total de fotos baixadas: **{sum(c['qtd_fotos'] for c in processados)}**\n")
    relatorio.append("---\n")
    relatorio.append(f"## ✅ ESTOQUE ATIVO COMPLETO ({len(processados)} veiculos)\n")
    relatorio.append("| # | Pasta | Modelo | Ano | Km | Preco | Fotos | ID |")
    relatorio.append("|---|-------|--------|-----|-----|-------|-------|----|")
    for c in processados:
        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("## \U0001f4de Contato")
    relatorio.append(f"- Vendedor: Rafael")
    relatorio.append(f"- WhatsApp: {WHATSAPP}")
    relatorio.append(f"- Site: {SITE}\n")
    md = "\n".join(relatorio)
    (BASE / f"RELATORIO_ATUALIZACAO_{HOJE}.md").write_text(md, encoding="utf-8")
    print(f"==> RELATORIO_ATUALIZACAO_{HOJE}.md salvo")

    # Espelho Obsidian
    try:
        OBSIDIAN.mkdir(parents=True, exist_ok=True)
        obs = OBSIDIAN / f"{HOJE} - Atualizacao Estoque Up Motors.md"
        obs.write_text(md, encoding="utf-8")
        print(f"==> Espelho Obsidian: {obs}")
    except Exception as e:
        print(f"  ! Erro Obsidian: {e}")

    print(f"\n== FINALIZADO ==")
    print(f"Total: {len(processados)} | Com fotos: {com} | Fotos: {sum(c['qtd_fotos'] for c in processados)}")

if __name__ == "__main__":
    main()
