# /opt/docker/dev/service_finder/backend/app/seed_system.py
import asyncio
import logging
import uuid
from sqlalchemy import select
from app.database import AsyncSessionLocal
from app.models.identity import User, Person, UserRole
from app.models.system import SystemParameter, PointRule, LevelConfig, SubscriptionTier, UserStats
from app.core.security import get_password_hash
from app.core.config import settings

# Logolás beállítása a Sentinel monitorozáshoz
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Sentinel-Seed: %(message)s')
logger = logging.getLogger("System-Seeder")

async def seed_data():
    """ 
    Rendszer alapadatok inicializálása: 
    Admin, Gamification szabályok és Előfizetési szintek.
    """
    async with AsyncSessionLocal() as db:
        logger.info("🚀 Rendszer-alapozás indítása (MB2.0 Standard)...")

        admin_email = settings.INITIAL_ADMIN_EMAIL
        admin_password = settings.INITIAL_ADMIN_PASSWORD

        if not admin_email or not admin_password:
            logger.error("❌ HIBA: Admin hitelesítési adatok hiányoznak a környezeti változókból!")
            return

        # 1. LOGIKA: Superadmin létrehozása (Identity + Person link)
        stmt = select(User).where(User.email == admin_email)
        admin_exists = (await db.execute(stmt)).scalar_one_or_none()

        if not admin_exists:
            # Személy létrehozása
            new_person = Person(
                first_name="Rendszer",
                last_name="Adminisztrátor",
                id_uuid=uuid.uuid4(),
                is_active=True
            )
            db.add(new_person)
            await db.flush()

            # Felhasználó létrehozása
            new_admin = User(
                email=admin_email,
                hashed_password=get_password_hash(admin_password),
                role=UserRole.superadmin,
                is_active=True,
                person_id=new_person.id,
                reputation_score=100  # Az admin hírneve alapértelmezetten magas
            )
            db.add(new_admin)
            await db.flush()
            
            # Statisztikai rekord létrehozása a Gamificationhöz
            db.add(UserStats(user_id=new_admin.id, total_xp=0, current_level=1))
            logger.info(f"✅ Superadmin létrehozva: {admin_email}")

        # 2. LOGIKA: Rendszerparaméterek (Sentinel Config)
        params = [
            ("ASSET_REVIEW_CRITERIA", ["Kényelem", "Fogyasztás", "Megbízhatóság", "Szervizigény"], "Értékelési szempontok"),
            ("SECURITY_MAX_RECORDS_PER_HOUR", "50", "Biztonsági limit óránkénti feltöltésre")
        ]
        for key, val, desc in params:
            stmt_p = select(SystemParameter).where(SystemParameter.key == key)
            if not (await db.execute(stmt_p)).scalar_one_or_none():
                db.add(SystemParameter(key=key, value=val, description=desc))

        # 3. LOGIKA: Gamification Pontszabályok
        rules = [
            ("ASSET_REGISTER", 100, "Új jármű felvétele"),
            ("ASSET_REVIEW", 75, "Jármű értékelése"),
            ("COST_RECORD", 50, "Költség rögzítése (tankolás/szerviz)"),
            ("OCR_UPLOAD", 120, "Dokumentum sikeres OCR feldolgozása")
        ]
        for key, pts, desc in rules:
            stmt_r = select(PointRule).where(PointRule.action_key == key)
            if not (await db.execute(stmt_r)).scalar_one_or_none():
                db.add(PointRule(action_key=key, points=pts, description=desc))

        # 4. LOGIKA: Gamification Rangok (Levels)
        stmt_l = select(LevelConfig)
        if not (await db.execute(stmt_l)).first():
            db.add_all([
                LevelConfig(level_number=1, min_points=0, rank_name="Kezdő Sofőr"),
                LevelConfig(level_number=2, min_points=1000, rank_name="Tapasztalt Vezető"),
                LevelConfig(level_number=3, min_points=5000, rank_name="Flotta Mester"),
                LevelConfig(level_number=4, min_points=15000, rank_name="Sentinel Legenda")
            ])

        # 5. LOGIKA: Előfizetési Csomagok (Subscription Tiers)
        stmt_t = select(SubscriptionTier)
        if not (await db.execute(stmt_t)).first():
            db.add_all([
                SubscriptionTier(name="FREE", rules={"max_assets": 1, "ai_ocr": False, "reports": False}),
                SubscriptionTier(name="PREMIUM", rules={"max_assets": 10, "ai_ocr": True, "reports": True}),
                SubscriptionTier(name="FLEET", rules={"max_assets": 500, "ai_ocr": True, "reports": True, "api_access": True})
            ])

        await db.commit()
        logger.info("✨ A Sentinel ökoszisztéma alapjai sikeresen rögzítve!")

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