import asyncio
import sys
import os

# Hozzáadjuk az app könyvtárat az útvonalhoz, hogy működjenek az importok
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

from app.core.database import SessionLocal  # FIGYELEM: Itt a régi vagy új helytől függően ellenőrizd!
# Ha a SessionLocal a db/session.py-ben van:
# from app.db.session import SessionLocal

from app.models.user import User
from app.models.social import ServiceProvider, Competition, ModerationStatus
from app.services.social_service import vote_for_provider
from sqlalchemy import text
from datetime import datetime, timedelta

async def run_simulation():
    async with SessionLocal() as db:
        print("--- 1. TAKARÍTÁS (Előző tesztadatok törlése) ---")
        # Kaszkádolt törlés a data sémában
        await db.execute(text("TRUNCATE TABLE data.user_scores, data.votes, data.service_providers, data.competitions, data.users RESTART IDENTITY CASCADE"))
        await db.commit()

        print("\n--- 2. SZEREPLŐK LÉTREHOZÁSA ---")
        # Admin
        admin = User(email="admin@test.com", password_hash="hash", full_name="Admin", is_superuser=True)
        # Jófiú (aki valós boltokat tölt fel)
        good_user = User(email="good@test.com", password_hash="hash", full_name="Good Guy", reputation_score=5)
        # Rosszfiú (aki fake boltokat tölt fel)
        bad_user = User(email="bad@test.com", password_hash="hash", full_name="Spammer", reputation_score=-8) # Közel a banhoz
        # Szavazóközönség
        voter1 = User(email="voter1@test.com", password_hash="hash", full_name="Voter 1")
        voter2 = User(email="voter2@test.com", password_hash="hash", full_name="Voter 2")
        voter3 = User(email="voter3@test.com", password_hash="hash", full_name="Voter 3")
        voter4 = User(email="voter4@test.com", password_hash="hash", full_name="Voter 4")
        voter5 = User(email="voter5@test.com", password_hash="hash", full_name="Voter 5")

        db.add_all([admin, good_user, bad_user, voter1, voter2, voter3, voter4, voter5])
        await db.commit()
        
        # ID-k lekérése
        for u in [good_user, bad_user, voter1, voter2, voter3, voter4, voter5]:
            await db.refresh(u)

        print("\n--- 3. VERSENY INDÍTÁSA ---")
        race = Competition(
            name="Nagy Januári Verseny",
            description="Töltsd fel a legtöbb boltot!",
            start_date=datetime.utcnow() - timedelta(days=1),
            end_date=datetime.utcnow() + timedelta(days=30),
            is_active=True
        )
        db.add(race)
        await db.commit()
        await db.refresh(race)

        print("\n--- 4. SZCENÁRIÓ A: A JÓ FELHASZNÁLÓ ---")
        # Good Guy feltölt egy boltot
        good_shop = ServiceProvider(
            name="Korrekt Gumiszerviz", 
            address="Fő utca 1.", 
            added_by_user_id=good_user.id,
            status=ModerationStatus.pending
        )
        db.add(good_shop)
        await db.commit()
        await db.refresh(good_shop)

        # A tömeg megszavazza (Kell 5 pont az elfogadáshoz)
        print(f"Szavazás a '{good_shop.name}' boltra...")
        await vote_for_provider(db, voter1.id, good_shop.id, 1)
        await vote_for_provider(db, voter2.id, good_shop.id, 1)
        await vote_for_provider(db, voter3.id, good_shop.id, 1)
        await vote_for_provider(db, voter4.id, good_shop.id, 1)
        await vote_for_provider(db, voter5.id, good_shop.id, 1) # Itt éri el az 5-öt!

        # Eredmény ellenőrzése
        await db.refresh(good_user)
        print(f"Good Guy Hírneve (Elvárt: 6): {good_user.reputation_score}")
        # Pontszám ellenőrzése közvetlen SQL-el a biztonság kedvéért
        points = await db.execute(text(f"SELECT points FROM data.user_scores WHERE user_id={good_user.id}"))
        print(f"Good Guy Verseny Pontjai (Elvárt: 10): {points.scalar()}")

        print("\n--- 5. SZCENÁRIÓ B: A ROSSZ FELHASZNÁLÓ (AUTO-BAN TESZT) ---")
        # Bad Guy feltölt egy fake boltot
        fake_shop = ServiceProvider(
            name="KAMU Bolt", 
            address="Nincs ilyen utca", 
            added_by_user_id=bad_user.id,
            status=ModerationStatus.pending
        )
        db.add(fake_shop)
        await db.commit()
        await db.refresh(fake_shop)

        # A tömeg leszavazza (Kell -3 az elutasításhoz)
        print(f"Szavazás a '{fake_shop.name}' boltra...")
        await vote_for_provider(db, voter1.id, fake_shop.id, -1)
        await vote_for_provider(db, voter2.id, fake_shop.id, -1)
        await vote_for_provider(db, voter3.id, fake_shop.id, -1) # Itt éri el a -3-at!

        # Eredmény ellenőrzése
        await db.refresh(bad_user)
        print(f"Bad User Hírneve (Elvárt: -10): {bad_user.reputation_score}")
        print(f"Bad User Aktív? (Elvárt: False/Banned): {bad_user.is_active}")

        if not bad_user.is_active:
            print("✅ SIKER: A rendszer automatikusan kitiltotta a csalót!")
        else:
            print("❌ HIBA: A felhasználó még mindig aktív.")

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