# /opt/docker/dev/service_finder/backend/app/tests_internal/diagnostics/diagnose_system.py
"""
🛰️  SENTINEL SYSTEM DIAGNOSTICS - MB2.0 (2026)
---------------------------------------------
CÉL: A rendszer mélyszintű integritásának és működőképességének auditálása.

FŐBB TESZTEK:
1. Adatbázis Kapcsolat: PostgreSQL aszinkron elérés ellenőrzése.
2. Séma Integritás: Kritikus Master Data táblák és mezők meglétének vizsgálata.
3. Rendszer Paraméterek: A Sentinel központi konfigurációs táblájának ellenőrzése.
4. i18n Motor: Nyelvi gyorsítótár (Cache) és fordítási mechanizmus tesztje.
5. Robot Pipeline: Staging (Hunter) és Gold (Catalog) rekordok számlálása.

FUTTATÁS:
docker compose exec api python -m app.tests_internal.diagnostics.diagnose_system
"""

import asyncio
import sys
import logging
from datetime import datetime
from sqlalchemy import text, select, func

# 🛠️ KRITIKUS IMPORT KÖRNYEZET ELLENŐRZÉSE
try:
    from app.core.config import settings
    # Megjegyzés: A projekt struktúrájától függően AsyncSessionLocal az app.database-ben van
    from app.database import AsyncSessionLocal
    from app.services.translation_service import translation_service
    from app.models.system import SystemParameter
    from app.models.identity import User
    from app.models.marketplace.organization import Organization
    from app.models import AssetCatalog
    from app.models import VehicleModelDefinition
except ImportError as e:
    print(f"\n❌ [KRITIKUS HIBA] Az importálás nem sikerült: {e}")
    print("💡 Javaslat: Ellenőrizd a PYTHONPATH-t és a __init__.py fájlok meglétét!")
    sys.exit(1)

# SQL logolás némítása a tiszta kimenet érdekében
logging.getLogger('sqlalchemy.engine').setLevel(logging.WARNING)

async def diagnose():
    start_time = datetime.now()
    print("\n" + "═"*70)
    print(f"🛰️  SENTINEL SYSTEM DIAGNOSTICS - MB2.0 | {start_time.strftime('%Y-%m-%d %H:%M:%S')}")
    print("═"*70 + "\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 (Master Data Audit) ---
        print("\n2️⃣  Séma integritás ellenőrzése (Kritikus mezők)...")
        # Tábla neve (sémával) | Elvárt oszlopok listája
        tables_to_check = [
            ("identity.users", ["preferred_language", "scope_id", "is_active"]),
            ("fleet.organizations", ["org_type", "folder_slug", "is_active"]),
            ("data.assets", ["owner_org_id", "catalog_id", "vin"]),
            # "asset_catalog" helyett "vehicle_catalog"
            ("vehicle.vehicle_catalog", ["make", "model", "factory_data"]), 
            ("vehicle.vehicle_model_definitions", ["status", "raw_search_context"])
        ]

        for table, columns in tables_to_check:
            try:
                schema_name, table_name = table.split('.')
                query = text(f"""
                    SELECT column_name FROM information_schema.columns 
                    WHERE table_schema = '{schema_name}' 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:35} (Minden mező rendben)")
                else:
                    print(f"   [⚠️  HIÁNY] {table:35} | 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 (Sentinel Config) ---
        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")
                # Kritikus kulcsok, amiknek illik lenniük
                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 "❌ (Hiányzik)"
                    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:
            # Gyorsítótár frissítése az adatbázisból
            await translation_service.load_cache(session)
            
            test_key = "COMMON.SAVE"
            test_val = translation_service.get_text(test_key, "hu")
            
            # Ha a visszakapott érték nem egyezik a kulccsal, akkor van fordítás
            if test_val and test_val != f"[{test_key}]":
                print(f"   [✅ OK] Fordítás sikeres (HU): '{test_key}' -> '{test_val}'")
            else:
                print(f"   [❌ HIBA] Fordítás nem működik. Nincs betöltött adat vagy hibás a cache.")
        except Exception as e:
            print(f"   [❌ HIBA] Nyelvi motor hiba: {e}")

        # --- 5. ROBOT ELŐKÉSZÜLETEK (Pipeline MDM) ---
        print("\n5️⃣  Robot Pipeline (MDM Staging) állapot...")
        try:
            # Hunter robot eredményei (nyers adatok)
            res_hunter = await session.execute(
                select(func.count(VehicleModelDefinition.id)).where(VehicleModelDefinition.status == 'unverified')
            )
            unverified_count = res_hunter.scalar() or 0
            
            # Catalog robot eredményei (tisztított adatok)
            res_gold = await session.execute(select(func.count(AssetCatalog.id)))
            gold_count = res_gold.scalar() or 0

            print(f"   [📊 STAT] Feldolgozatlan rekordok (Staging): {unverified_count} db")
            print(f"   [📊 STAT] Validált arany rekordok (Catalog): {gold_count} db")
        except Exception as e:
            print(f"   [❌ HIBA] Robot-statisztika hiba: {e}")

    duration = (datetime.now() - start_time).total_seconds()
    print("\n" + "═"*70)
    print(f"🏁 DIAGNOSZTIKA BEFEJEZŐDÖTT | Időtartam: {duration:.2f} mp")
    print("═"*70 + "\n")

if __name__ == "__main__":
    try:
        asyncio.run(diagnose())
    except KeyboardInterrupt:
        print("\n🛑 Diagnosztika megszakítva a felhasználó által.")
        sys.exit(0)