# /opt/docker/dev/service_finder/backend/app/diagnose_system.py
import asyncio
import sys
import logging
from sqlalchemy import text, select, func
from sqlalchemy.ext.asyncio import AsyncSession

# MB2.0 Importok
try:
    from app.core.config import settings
    from app.database import AsyncSessionLocal, engine
    from app.services.translation_service import translation_service
    from app.models.system import SystemParameter
    from app.models.identity import User
    from app.models.organization import Organization
    from app.models.asset import AssetCatalog
    from app.models.vehicle_definitions import VehicleModelDefinition
except ImportError as e:
    print(f"❌ Kritikus import hiba: {e}")
    print("Győződj meg róla, hogy a PYTHONPATH tartalmazza a /backend mappát!")
    sys.exit(1)

# Naplózás kikapcsolása a tiszta diagnosztikai kimenetért
logging.getLogger('sqlalchemy.engine').setLevel(logging.WARNING)

async def diagnose():
    print("\n" + "═"*50)
    print("🛰️  SENTINEL SYSTEM DIAGNOSTICS - MB2.0 (2026)")
    print("═"*50 + "\n")

    async with AsyncSessionLocal() as session:
        # --- 1. CSATLAKOZÁS ÉS ADATBÁZIS PING ---
        print("1️⃣  Kapcsolódási teszt...")
        try:
            await session.execute(text("SELECT 1"))
            print("   [✅ OK] PostgreSQL aszinkron kapcsolat aktív.")
        except Exception as e:
            print(f"   [❌ HIBA] Nem sikerült kapcsolódni az adatbázishoz: {e}")
            return

        # --- 2. SÉMA INTEGRITÁS (MB2.0 Specifikus) ---
        print("\n2️⃣  Séma integritás ellenőrzése (Master Data)...")
        tables_to_check = [
            ("identity.users", ["preferred_language", "scope_id", "is_active"]),
            ("data.organizations", ["org_type", "folder_slug", "is_active"]),
            ("data.assets", ["owner_org_id", "catalog_id", "vin"]),
            ("data.asset_catalog", ["make", "model", "factory_data"]),
            ("data.vehicle_model_definitions", ["status", "raw_search_context"])
        ]

        for table, columns in tables_to_check:
            try:
                schema, table_name = table.split('.')
                query = text(f"""
                    SELECT column_name FROM information_schema.columns 
                    WHERE table_schema = '{schema}' AND table_name = '{table_name}';
                """)
                res = await session.execute(query)
                existing_cols = [row[0] for row in res.fetchall()]
                
                if not existing_cols:
                    print(f"   [❌ HIBA] A tábla nem létezik: {table}")
                    continue

                missing = [c for c in columns if c not in existing_cols]
                if not missing:
                    print(f"   [✅ OK] {table} (Minden mező a helyén)")
                else:
                    print(f"   [⚠️  HIÁNY] {table} - Hiányzó mezők: {', '.join(missing)}")
            except Exception as e:
                print(f"   [❌ HIBA] Hiba a(z) {table} ellenőrzésekor: {e}")

        # --- 3. RENDSZER PARAMÉTEREK ---
        print("\n3️⃣  System Parameters (Sentinel Config) ellenőrzése...")
        try:
            res = await session.execute(select(SystemParameter))
            params = res.scalars().all()
            if params:
                print(f"   [✅ OK] Talált paraméterek: {len(params)} db")
                critical_keys = ["SECURITY_MAX_RECORDS_PER_HOUR", "VEHICLE_LIMIT"]
                existing_keys = [p.key for p in params]
                for ck in critical_keys:
                    status = "✔️" if ck in existing_keys else "❌"
                    print(f"      {status} {ck}")
            else:
                print("   [⚠️  FIGYELEM] A system_parameters tábla üres! Futtasd a seedert.")
        except Exception as e:
            print(f"   [❌ HIBA] SystemParameter lekérdezési hiba: {e}")

        # --- 4. i18n ÉS CACHE MOTOR ---
        print("\n4️⃣  Nyelvi motor és i18n Cache ellenőrzése...")
        try:
            # Cache betöltése manuálisan a diagnosztikához
            await translation_service.load_cache(session)
            
            test_key = "COMMON.SAVE"
            test_val = translation_service.get_text(test_key, "hu")
            
            if test_val != f"[{test_key}]":
                print(f"   [✅ OK] Fordítás sikeres (HU): {test_key} -> '{test_val}'")
            else:
                print(f"   [❌ HIBA] A fordítás nem működik. Nincs betöltött adat az adatbázisban.")
        except Exception as e:
            print(f"   [❌ HIBA] Nyelvi motor hiba: {e}")

        # --- 5. ROBOT ELŐKÉSZÜLETEK (MDM) ---
        print("\n5️⃣  Robot Pipeline (MDM Staging) állapot...")
        try:
            res_hunter = await session.execute(
                select(func.count(VehicleModelDefinition.id)).where(VehicleModelDefinition.status == 'unverified')
            )
            unverified_count = res_hunter.scalar()
            
            res_gold = await session.execute(
                select(func.count(AssetCatalog.id))
            )
            gold_count = res_gold.scalar()

            print(f"   [📊 ADAT] Staging rekordok (Hunter): {unverified_count} db")
            print(f"   [📊 ADAT] Arany rekordok (Catalog): {gold_count} db")
        except Exception as e:
            print(f"   [❌ HIBA] Robot-statisztika hiba: {e}")

    print("\n" + "═"*50)
    print("🏁 DIAGNOSZTIKA BEFEJEZŐDÖTT")
    print("═"*50 + "\n")

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