"""
Script d'initialisation de données de démonstration (Seed Data).
Crée un ensemble d'opérateurs d'airsoft avec le mot de passe par défaut 'password123',
et configure des disponibilités d'exemple pour tester immédiatement le déclenchement des parties à 8+ joueurs.
"""

from datetime import date, timedelta
from database import SessionLocal, init_db
from models import User, Availability, Game, VALID_SLOTS
from auth import hash_password

SAMPLE_USERS = [
    ("Ghost_78", "password123"),
    ("CaptainPrice", "password123"),
    ("Soap_MacTavish", "password123"),
    ("Roach_Sniper", "password123"),
    ("Gaz_Versailles", "password123"),
    ("Nomad_Recon", "password123"),
    ("Viper_CQB", "password123"),
    ("Reaper_Support", "password123"),
    ("Shadow_Airsoft", "password123"),
    ("Valkyrie", "password123"),
    ("Alex_Versailles", "password123"),
]


def seed_database():
    """Remplit la base de données avec des utilisateurs et des disponibilités de test."""
    init_db()
    db = SessionLocal()
    try:
        created_users = []
        for username, password in SAMPLE_USERS:
            user = db.query(User).filter(User.username == username).first()
            if not user:
                user = User(
                    username=username,
                    hashed_password=hash_password(password)
                )
                db.add(user)
                db.flush()
                print(f"[Seed] Utilisateur créé : {username}")
            created_users.append(user)
        db.commit()

        # Configurer des disponibilités d'exemple
        today = date.today()
        
        # Trouver le prochain samedi et dimanche
        days_until_saturday = (5 - today.weekday()) % 7
        if days_until_saturday == 0:
            days_until_saturday = 7
        next_saturday = today + timedelta(days=days_until_saturday)
        next_sunday = next_saturday + timedelta(days=1)
        next_next_saturday = next_saturday + timedelta(days=7)

        # Scénario 1 : Prochain samedi matin -> 8 joueurs (Partie confirmée !)
        slot_matin = VALID_SLOTS[0]
        for user in created_users[:8]:
            exists = db.query(Availability).filter(
                Availability.user_id == user.id,
                Availability.date == next_saturday,
                Availability.slot == slot_matin
            ).first()
            if not exists:
                db.add(Availability(user_id=user.id, date=next_saturday, slot=slot_matin))
        
        # Enregistrer la partie correspondante
        game_sat = db.query(Game).filter(Game.date == next_saturday, Game.slot == slot_matin).first()
        if not game_sat:
            game_sat = Game(
                date=next_saturday,
                slot=slot_matin,
                player_count=8,
                notified_discord=False
            )
            db.add(game_sat)

        # Scénario 2 : Prochain dimanche après-midi -> 5 joueurs (En attente de 3 joueurs)
        slot_aprem = VALID_SLOTS[1]
        for user in created_users[:5]:
            exists = db.query(Availability).filter(
                Availability.user_id == user.id,
                Availability.date == next_sunday,
                Availability.slot == slot_aprem
            ).first()
            if not exists:
                db.add(Availability(user_id=user.id, date=next_sunday, slot=slot_aprem))

        # Scénario 3 : Samedi suivant après-midi -> 3 joueurs
        for user in created_users[2:5]:
            exists = db.query(Availability).filter(
                Availability.user_id == user.id,
                Availability.date == next_next_saturday,
                Availability.slot == slot_aprem
            ).first()
            if not exists:
                db.add(Availability(user_id=user.id, date=next_next_saturday, slot=slot_aprem))

        db.commit()
        print(f"[Seed] Base de données initialisée avec succès avec {len(created_users)} opérateurs !")
        print(f"[Seed] Compte de test recommandé : 'Ghost_78' / 'password123' ou 'Alex_Versailles' / 'password123'")
    except Exception as e:
        db.rollback()
        print(f"[Seed] Erreur lors du peuplement : {e}")
    finally:
        db.close()


if __name__ == "__main__":
    seed_database()
