import asyncio
import sys
import os
from pathlib import Path

# FONTOS: A dotenv betöltése minden app-specifikus import ELŐTT kell megtörténjen!
from dotenv import load_dotenv
env_path = Path("/home/coder/project/opt/service_finder/.env")
load_dotenv(dotenv_path=env_path)

# Útvonal beállítása a modulokhoz
sys.path.append("/home/coder/project/opt/service_finder/backend")

# Most már importálhatjuk a session-t, mert a környezeti változók már a memóriában vannak
from sqlalchemy import select
from app.db.session import AsyncSessionLocal # Javítva: AsyncSessionLocal-t használunk
from app.services.social_service import create_service_provider
from app.models.gamification import UserStats, PointsLedger
from app.models.user import User
from app.schemas.social import ServiceProviderCreate

async def run_test():
    print("🚀 Gamifikációs integrációs teszt indul...")
    
    # Az AsyncSessionLocal() egy context manager, így az 'async with' a helyes használat
    async with AsyncSessionLocal() as db:
        try:
            # 1. Teszt felhasználó lekérése
            result = await db.execute(select(User).limit(1))
            user = result.scalars().first()
            
            if not user:
                print("❌ Hiba: Nincs felhasználó az adatbázisban a teszthez!")
                return

            print(f"👤 Teszt felhasználó: {user.email} (ID: {user.id})")

            # 2. Új szolgáltató rögzítése (ez váltja ki a pontszerzést)
            unique_suffix = os.urandom(2).hex()
            test_provider = ServiceProviderCreate(
                name=f"Teszt Szerviz {unique_suffix}",
                address="Teszt utca 123.",
                category="Service"
            )

            print(f"🛠️ Szolgáltató rögzítése: {test_provider.name}...")
            new_provider = await create_service_provider(db, test_provider, user.id)
            print(f"✅ Szolgáltató rögzítve (ID: {new_provider.id})")

            # 3. Pontszám és napló ellenőrzése
            # Megjegyzés: A social_service commit-ol, így itt újra le kell kérnünk az adatokat
            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.id.desc())
                .limit(1)
            )
            last_entry = ledger_res.scalars().first()

            print("\n" + "="*30)
            print("📊 TESZT EREDMÉNYEK:")
            if stats:
                print(f"🏆 Összesített pontszám: {stats.total_points}")
                print(f"📈 Aktuális szint: {stats.current_level}")
            else:
                print("⚠️ Figyelem: UserStats nem található (lehet, hogy most készült el?)")

            if last_entry:
                print(f"📝 Utolsó tranzakció: {last_entry.reason}")
                print(f"💰 Jóváírt pont: {last_entry.points_change}")
            print("="*30)

        except Exception as e:
            print(f"💥 Kritikus hiba a teszt futtatása közben: {str(e)}")
            import traceback
            traceback.print_exc()

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