import httpx
import asyncio
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from app.models.vehicle import VehicleCatalog # Az imént létrehozott modell

class VehicleHarvester:
    def __init__(self):
        # Az ingyenes CarQueryAPI URL-je (0.3-as verzió)
        self.base_url = "https://www.carqueryapi.com/api/0.3/"
        self.headers = {"User-Agent": "ServiceFinder-Harvester-Bot/1.0"}

    async def get_data(self, params: dict):
        """Segédfüggvény az API hívásokhoz."""
        async with httpx.AsyncClient() as client:
            try:
                response = await client.get(self.base_url, params=params, headers=self.headers, timeout=10.0)
                if response.status_code == 200:
                    # Az API néha JSONP-t ad vissza, ezt itt lekezeljük (levágjuk a felesleget)
                    text = response.text
                    if text.startswith("?("): text = text[2:-2]
                    return response.json()
                return None
            except Exception as e:
                print(f"Robot hiba: {str(e)}")
                return None

    async def harvest_all(self, db: AsyncSession):
        """A fő folyamat: Minden márka -> Minden modell szinkronizálása."""
        print("🤖 Robot: Indul a nagy adatgyűjtés...")
        
        # 1. Márkák lekérése
        makes_data = await self.get_data({"cmd": "getMakes", "sold_in_us": 0})
        if not makes_data: return
        
        makes = makes_data.get("Makes", [])
        
        for make in makes:
            make_id = make['make_id']
            make_display = make['make_display']
            print(f"--- 🚗 Feldolgozás: {make_display} ---")
            
            # 2. Modellek lekérése ehhez a márkához
            models_data = await self.get_data({"cmd": "getModels", "make": make_id})
            if not models_data: continue
            
            models = models_data.get("Models", [])
            
            for model in models:
                model_name = model['model_name']
                
                # 3. Megnézzük, benne van-e már a katalógusban
                stmt = select(VehicleCatalog).where(
                    VehicleCatalog.brand == make_display,
                    VehicleCatalog.model == model_name
                )
                res = await db.execute(stmt)
                if res.scalar_one_or_none():
                    continue # Ha már megvan, ugrunk a következőre
                
                # 4. Új bejegyzés létrehozása alapadatokkal
                # Itt a Robot később "mélyebbre" áshat a specifikációkért
                new_v = VehicleCatalog(
                    brand=make_display,
                    model=model_name,
                    category="car", # Alapértelmezett, később finomítható
                    factory_specs={
                        "api_make_id": make_id,
                        "harvester_source": "carquery"
                    }
                )
                db.add(new_v)
                print(f"✅ Robot rögzítve: {make_display} {model_name}")
                
            # Márkánként mentünk, hogy ne vesszen el a munka, ha megszakad
            await db.commit()
            await asyncio.sleep(1) # Ne terheljük túl az ingyenes API-t (Rate Limit védelem)

        print("🏁 Robot: A munka oroszlánrésze kész!")

# Ez a rész csak a teszteléshez kell, ha manuálisan indítod a scriptet
if __name__ == "__main__":
    # Itt lehetne egy külön indító logika
    pass