# /opt/docker/dev/service_finder/backend/app/tests_internal/test_gamification_flow.py
import asyncio
import os
import sys
import logging
from sqlalchemy import select
from dotenv import load_dotenv

# Környezeti változók betöltése
load_dotenv()

# MB2.0 Importok
from app.database import AsyncSessionLocal
from app.models.identity import User
from app.models import UserStats, PointsLedger
from app.services.social_service import SocialService
from app.schemas.social import ServiceProviderCreate

# Naplózás beállítása
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Sentinel-Test: %(message)s')
logger = logging.getLogger("Gamification-Test")

async def run_test():
    logger.info("🚀 Gamifikációs integrációs folyamat tesztelése...")
    
    async with AsyncSessionLocal() as db:
        try:
            # 1. LOGIKA: Teszt felhasználó lekérése az identity sémából
            result = await db.execute(select(User).limit(1))
            user = result.scalars().first()
            
            if not user:
                logger.error("❌ Hiba: Nincs felhasználó az adatbázisban. Futtasd a seed_system.py-t!")
                return

            logger.info(f"👤 Aktív teszt alany: {user.email}")

            # 2. LOGIKA: Új szolgáltató rögzítése (Trigger az XP szerzéshez)
            # A SocialService.create_service_provider automatikusan hívja a GamificationService-t
            unique_id = os.urandom(2).hex()
            test_provider = ServiceProviderCreate(
                name=f"Robot Szerviz {unique_id}",
                address="Alchemist utca 12.",
                category="service"
            )

            logger.info(f"🛠️ Esemény kiváltása: '{test_provider.name}' rögzítése...")
            new_provider = await SocialService.create_service_provider(db, test_provider, user.id)
            
            # Commit kényszerítése, hogy a háttérfolyamatok rögzüljenek
            await db.commit()
            logger.info(f"✅ Szolgáltató elfogadva (ID: {new_provider.id})")

            # 3. LOGIKA: Eredmények ellenőrzése a Ledgerben (Főkönyv)
            # Újra lekérjük a statisztikákat a commit után
            stats_res = await db.execute(select(UserStats).where(UserStats.user_id == user.id))
            stats = stats_res.scalar_one_or_none()

            ledger_res = await db.execute(
                select(PointsLedger)
                .where(PointsLedger.user_id == user.id)
                .order_by(PointsLedger.created_at.desc())
                .limit(1)
            )
            last_entry = ledger_res.scalars().first()

            print("\n" + "═"*40)
            print("📊 INTEGRÁCIÓS JELENTÉS:")
            if stats:
                print(f"🏆 Aktuális XP: {stats.total_xp}")
                print(f"📈 Szint: {stats.current_level}")
            else:
                print("⚠️  UserStats rekord nem található!")

            if last_entry:
                print(f"📝 Tranzakció oka: {last_entry.reason}")
                print(f"💰 XP változás: +{last_entry.points_change}")
            print("═"*40 + "\n")

            if stats and stats.total_xp > 0:
                logger.info("✅ SIKER: A gamifikációs lánc éles és működik!")
            else:
                logger.warning("❌ HIBA: A pontszámítás nem történt meg.")

        except Exception as e:
            logger.error(f"💥 Kritikus hiba a teszt közben: {e}")
            import traceback
            traceback.print_exc()

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