# /app/app/workers/vehicle/vehicle_robot_0_strategist.py
import asyncio
import httpx
import logging
import os
from sqlalchemy import text
from app.database import AsyncSessionLocal # MB 2.0 Standard import

# Sentinel rendszerhez illesztett logolás
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s]: %(message)s')
logger = logging.getLogger("Vehicle-Robot-0-Strategist")

class Robot0Strategist:
    """
    THOUGHT PROCESS:
    1. A robot célja a 'priority_score' meghatározása valós piaci adatok (RDW) alapján.
    2. Első lépésben ellenőrizzük a sémát (Self-healing), hogy létezik-e az oszlop.
    3. A kategóriákat (autó, motor, teher) szétválasztjuk, hogy célzott prioritásokat kapjunk.
    4. Az 'ON CONFLICT' logika garantálja, hogy ne rontsuk el a már feldolgozott (processed) sorokat.
    5. A prioritás alapja a darabszám: minél több van egy típusból, annál előrébb kerül a listán.
    """
    RDW_API = "https://opendata.rdw.nl/resource/m9d7-ebf2.json"
    RDW_TOKEN = os.getenv("RDW_APP_TOKEN")
    HEADERS = {"X-App-Token": RDW_TOKEN} if RDW_TOKEN else {}

    # Holland típusok leképezése belső kategóriákra
    CATEGORIES = [
        {"name": "car", "rdw_types": ["'Personenauto'"]},
        {"name": "motorcycle", "rdw_types": ["'Motorfiets'"]},
        {"name": "truck", "rdw_types": ["'Bedrijfsauto'", "'Vrachtwagen'", "'Opleggertrekker'"]},
        {"name": "other", "rdw_types": ["NOT IN ('Personenauto', 'Motorfiets', 'Bedrijfsauto', 'Vrachtwagen', 'Opleggertrekker')"]}
    ]

    async def get_popular_makes(self, vehicle_class: str, rdw_types: list):
        """ Piaci adatok lekérése darabszám szerinti sorrendben. """
        if "NOT IN" in rdw_types[0]:
             type_filter = f"voertuigsoort {rdw_types[0]}"
        else:
             type_filter = " OR ".join([f"voertuigsoort = {t}" for t in rdw_types])

        params = {
            "$select": "merk, count(*) AS darabszam",
            "$where": type_filter,
            "$group": "merk",
            "$order": "darabszam DESC",
            "$limit": 500
        }

        async with httpx.AsyncClient(timeout=45.0) as client:
            try:
                resp = await client.get(self.RDW_API, params=params, headers=self.HEADERS)
                if resp.status_code == 200:
                    return resp.json()
                logger.error(f"⚠️ RDW API Hiba: {resp.status_code}")
                return []
            except Exception as e:
                logger.error(f"❌ Kapcsolati hiba az RDW felé: {e}")
                return []

    async def run(self):
        logger.info("🚀 Robot 0 (Strategist) ONLINE - Piaci elemzés indítása...")
        
        # --- SÉMA ELLENŐRZÉS (Golyóálló megoldás) ---
        async with AsyncSessionLocal() as db:
            try:
                await db.execute(text("ALTER TABLE vehicle.catalog_discovery ADD COLUMN IF NOT EXISTS priority_score INTEGER DEFAULT 0;"))
                await db.commit()
                logger.info("✅ Adatbázis séma rendben (priority_score aktív).")
            except Exception as e:
                await db.rollback()
                logger.error(f"⚠️ Séma hiba: {e}")
        
        for category in self.CATEGORIES:
            v_class = category["name"]
            logger.info(f"📊 {v_class.upper()} hadosztály prioritásainak számítása...")
            
            makes = await self.get_popular_makes(v_class, category["rdw_types"])
            if not makes: continue

            added_count = 0
            for item in makes:
                make_name = str(item.get("merk", "")).upper().strip()
                if not make_name: continue
                
                count = int(item.get("darabszam", 0))

                async with AsyncSessionLocal() as db:
                    try:
                        # UPSERT: Beállítjuk a prioritást, de nem bántjuk a már kész rekordokat
                        query = text("""
                            INSERT INTO vehicle.catalog_discovery (make, model, vehicle_class, status, source, attempts, priority_score)
                            VALUES (:make, 'ALL_VARIANTS', :class, 'pending', 'STRATEGIST-V2', 0, :score)
                            ON CONFLICT (make, model, vehicle_class)
                            DO UPDATE SET priority_score = :score
                            WHERE vehicle.catalog_discovery.status NOT IN ('processed', 'in_progress');
                        """)
                        
                        await db.execute(query, {"make": make_name, "class": v_class, "score": count})
                        await db.commit()
                        added_count += 1
                    except Exception as e:
                        await db.rollback()
                        logger.warning(f"❌ Hiba a márka rögzítésekor ({make_name}): {e}")
            
            logger.info(f"✅ {v_class.upper()} kategória kész: {added_count} márka rangsorolva.")

if __name__ == "__main__":
    asyncio.run(Robot0Strategist().run())