import sys
import os
import random
from datetime import datetime, date, timedelta

# Ensure the current directory is in the python path to import app modules
sys.path.append(os.getcwd())

from app.database import init_db
from app.models import SessionLocal
from app.models import auth_crud
from app.academia import crud as academia_crud


def main():
    """
    Script de utilidad para poblar la base de datos con usuarios de prueba.

    A diferencia de la versión anterior, este script:
      - Usa SQLAlchemy y el módulo `app.models.auth_crud`
      - Rellena también los datos de perfil, deporte, salud, marketing, etc.
      - Genera estadísticas coherentes con el flujo de registro de academy-register
        para que los gráficos de Gestión de usuarios aparezcan completos.
    """
    print("Inicializando base de datos...")
    init_db()

    users_to_create = [
        # Admin
        {
            "name": "Admin User",
            "email": "admin@example.com",
            "password": "admin123",
            "role": "admin"
        },
        # Moderadores/Docentes
        {
            "name": "Carlos García",
            "email": "carlos.garcia@example.com",
            "password": "docente123",
            "role": "docente"
        },
        {
            "name": "María López",
            "email": "maria.lopez@example.com",
            "password": "docente123",
            "role": "docente"
        },
        {
            "name": "Juan Martínez",
            "email": "juan.martinez@example.com",
            "password": "docente123",
            "role": "docente"
        },
        {
            "name": "Ana Rodríguez",
            "email": "ana.rodriguez@example.com",
            "password": "docente123",
            "role": "docente"
        },
        {
            "name": "Pedro Sánchez",
            "email": "pedro.sanchez@example.com",
            "password": "docente123",
            "role": "docente"
        },
        {
            "name": "Laura Fernández",
            "email": "laura.fernandez@example.com",
            "password": "docente123",
            "role": "docente"
        },
        {
            "name": "Miguel Gómez",
            "email": "miguel.gomez@example.com",
            "password": "docente123",
            "role": "docente"
        },
        {
            "name": "Isabel Díaz",
            "email": "isabel.diaz@example.com",
            "password": "docente123",
            "role": "docente"
        },
        {
            "name": "David Pérez",
            "email": "david.perez@example.com",
            "password": "docente123",
            "role": "docente"
        },
        {
            "name": "Carmen Ruiz",
            "email": "carmen.ruiz@example.com",
            "password": "docente123",
            "role": "docente"
        },
        # Jugadores/Alumnos
        {
            "name": "Alejandro Torres",
            "email": "alejandro.torres@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Sofía Moreno",
            "email": "sofia.moreno@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Daniel Jiménez",
            "email": "daniel.jimenez@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Lucía Navarro",
            "email": "lucia.navarro@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Pablo Romero",
            "email": "pablo.romero@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Elena Vázquez",
            "email": "elena.vazquez@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Javier Molina",
            "email": "javier.molina@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Marta Castro",
            "email": "marta.castro@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Adrián Ortiz",
            "email": "adrian.ortiz@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Paula Rubio",
            "email": "paula.rubio@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Sergio Delgado",
            "email": "sergio.delgado@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Cristina Herrera",
            "email": "cristina.herrera@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Rubén Medina",
            "email": "ruben.medina@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Natalia Campos",
            "email": "natalia.campos@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Marcos Prieto",
            "email": "marcos.prieto@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Beatriz Santos",
            "email": "beatriz.santos@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Raúl Iglesias",
            "email": "raul.iglesias@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Irene Pascual",
            "email": "irene.pascual@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Alberto Gil",
            "email": "alberto.gil@example.com",
            "password": "alumno123",
            "role": "alumno"
        },
        {
            "name": "Clara Méndez",
            "email": "clara.mendez@example.com",
            "password": "alumno123",
            "role": "alumno"
        }
    ]

    print("Creando usuarios y rellenando datos de perfil...")
    db = SessionLocal()
    try:
        for user_data in users_to_create:
            email = user_data["email"].lower()
            existing_user = auth_crud.get_user_by_email(db, email)

            if existing_user:
                print(f"Usuario {email} ya existe. Saltando.")
                continue

            try:
                # Crear usuario base
                user_id = auth_crud.create_user(
                    db=db,
                    name=user_data["name"],
                    email=email,
                    password=user_data["password"],
                    role=user_data["role"],
                )
                print(f"✓ Creado usuario: {email} ({user_data['role']}) con id={user_id}")

                # Solo los alumnos rellenan estadísticas deportivas/salud/etc.
                if user_data["role"] == "alumno":
                    _populate_fake_registration_data(db, user_id, user_data["name"], email)
                    print(f"  → Datos de registro simulados para {email}")
            except Exception as e:
                db.rollback()
                print(f"Error creando usuario {email}: {e}")

    finally:
        db.close()

    print("\nCreando cursos de ejemplo para la academia...")
    _create_sample_courses()

    print("\nHecho. Proceso de creación de usuarios y cursos completado.")


def _random_birth_date(min_age: int = 10, max_age: int = 18) -> date:
    """Genera una fecha de nacimiento aleatoria para un rango de edad dado."""
    today = date.today()
    start_year = today.year - max_age
    end_year = today.year - min_age
    start_date = date(start_year, 1, 1)
    end_date = date(end_year, 12, 31)
    delta_days = (end_date - start_date).days
    return start_date + timedelta(days=random.randint(0, delta_days))


def _populate_fake_registration_data(db, user_id: int, full_name: str, email: str) -> None:
    """
    Rellena las tablas user_profile, user_sports, user_health, user_consent,
    user_guardians, user_marketing y user_finance con datos coherentes,
    imitando lo que haría el formulario de academy-register.
    """
    # --- Datos base coherentes con estadisticas_crud ---
    cities = ["Oviedo", "Gijón", "Avilés", "Mieres", "Langreo", "Madrid", "Barcelona"]
    categories = ["prebenjamin", "benjamin", "alevin", "infantil", "cadete", "juvenil", "senior"]
    teams = ["Real Oviedo", "Sporting Gijón", "Juventud Estadio", "Covadonga", "Astur CF", "L4F Academy"]
    positions = [
        "Portero",
        "Central",
        "Lateral derecho",
        "Lateral izquierdo",
        "Mediocentro",
        "Extremo derecho",
        "Extremo izquierdo",
        "Delantero centro",
    ]
    dominant_feet = ["derecha", "izquierda"]
    occupations = ["estudio", "trabajo", "ambos"]
    found_us = ["boca-a-boca", "youtube", "instagram", "facebook", "tiktok", "web-google"]
    training_types = ["academy", "personal", "ambos"]
    yes_no = ["si", "no"]
    alcohol_opts = ["no-bebo", "ocasiones-especiales", "casualmente", "muy-seguido"]
    smoking_opts = ["no-fumo", "ocasiones-especiales", "casualmente", "muy-seguido"]
    phys_work_opts = ["si", "no", "no-lesionado"]

    # --- Perfil ---
    birth_date = _random_birth_date()
    dni = f"{random.randint(10000000, 99999999)}{random.choice('TRWAGMYFPDXBNJZSQVHLCKE')}"
    phone = f"+34 6{random.randint(10000000, 99999999)}"
    gender = random.choice(["masculino", "femenino"])

    auth_crud.update_user_profile(
        db,
        user_id,
        phone=phone,
        dni=dni,
        birth_date=birth_date.strftime("%Y-%m-%d"),
        city=random.choice(cities),
        gender=gender,
        avatar=None,
    )

    # --- Deportivos ---
    auth_crud.update_user_sports(
        db,
        user_id,
        team=random.choice(teams),
        category=random.choice(categories),
        position=random.choice(positions),
        dominant_foot=random.choice(dominant_feet),
        strengths="Velocidad, visión de juego, trabajo en equipo",
        weaknesses="Pierna no dominante, juego aéreo",
        training_type=random.choice(training_types),
        injury_history=random.choice(
            [
                "Sin lesiones importantes.",
                "Esguince leve de tobillo hace 1 año.",
                "Sobrecarga muscular puntual.",
            ]
        ),
    )

    # --- Salud ---
    physical_work = random.choice(phys_work_opts)
    phys_details = (
        "Gimnasio 2 días por semana." if physical_work == "si" else None
    )

    auth_crud.update_user_health(
        db,
        user_id,
        physical_work=physical_work,
        physical_work_details=phys_details,
        smoking=random.choice(smoking_opts),
        alcohol=random.choice(alcohol_opts),
        recovery=random.choice(yes_no),  # 'si' / 'no' → ver LABELS_RECUPERACION
        chest_pain=random.choice(yes_no),
        discomfort=random.choice(yes_no),
    )

    # --- Consentimientos ---
    auth_crud.update_user_consent(
        db,
        user_id,
        whatsapp_content=random.choice(yes_no),
        video_permission=random.choice(yes_no),
        privacy_acceptance=1,
        data_confirmation=1,
        agreement=1,
    )

    # --- Tutores / Ocupación ---
    occupation = random.choice(occupations)
    auth_crud.update_user_guardians(
        db,
        user_id,
        occupation=occupation,
        study_place="IES Campoamor" if occupation != "trabajo" else "—",
        parent_name=f"Padre/Madre de {full_name.split()[0]}",
        parent_email=f"familia+{user_id}@example.com",
    )

    # --- Marketing / Cómo nos conoció ---
    auth_crud.update_user_marketing(
        db,
        user_id,
        found_us=random.choice(found_us),
        enjoyment=random.choice(yes_no),
        nerves_confidence=random.choice(yes_no),
        additional_comments="Usuario de prueba creado por script.",
    )

    # --- Finanzas ---
    auth_crud.update_user_finance(
        db,
        user_id,
        matricula_eur=random.choice([0.0, 25.0, 49.0, 79.0]),
    )


def _create_sample_courses():
    """Create sample courses with rich content for the academy"""
    import json
    
    db = SessionLocal()
    try:
        # Get admin user ID for course creation
        admin_user = auth_crud.get_user_by_email(db, "admin@example.com")
        if not admin_user:
            print("No se encontró usuario admin. No se pueden crear cursos.")
            return
        
        admin_id = admin_user.id
        
        # Sample courses data
        courses_data = [
            {
                "title": "Fundamentos del Fútbol Base",
                "description": "Curso completo para iniciarse en el fútbol base, cubriendo técnicas básicas, reglas y principios del juego.",
                "status": "published",
                "order_index": 1,
                "sections": [
                    {
                        "title": "Introducción al Fútbol",
                        "description": "Conceptos básicos e historia del fútbol",
                        "lessons": [
                            {
                                "title": "¿Qué es el fútbol?",
                                "description": "Introducción a los conceptos fundamentales del fútbol",
                                "content_type": "text",
                                "content_data": json.dumps({
                                    "content": "# ¿Qué es el fútbol?\n\nEl fútbol es un deporte de equipo que se juega entre dos conjuntos de 11 jugadores cada uno. El objetivo es marcar más goles que el equipo contrario en el tiempo reglamentario.\n\n## Orígenes del fútbol\n\nEl fútbol moderno tiene sus raíces en Inglaterra del siglo XIX, aunque juegos similares existían desde la antigüedad en diferentes culturas.\n\n## Elementos básicos\n\n- **Balón**: Esférico, de cuero o material sintético\n- **Campo**: Rectangular con dos porterías\n- **Jugadores**: 11 por equipo (incluido el portero)\n- **Duración**: 90 minutos divididos en dos tiempos de 45\n\n## Valores del fútbol\n\nEl fútbol enseña valores importantes como:\n- Trabajo en equipo\n- Respeto\n- Disciplina\n- Superación personal\n\n¡Bienvenido al maravilloso mundo del fútbol!"
                                }),
                                "duration_minutes": 15
                            },
                            {
                                "title": "Historia del fútbol",
                                "description": "Conoce la evolución histórica del fútbol",
                                "content_type": "video",
                                "content_data": json.dumps({
                                    "videos": [
                                        {
                                            "url": "https://www.youtube.com/embed/dQw4w9WgXcQ",
                                            "description": "Documental sobre los orígenes del fútbol moderno"
                                        }
                                    ]
                                }),
                                "duration_minutes": 20
                            }
                        ]
                    },
                    {
                        "title": "Técnicas Básicas",
                        "description": "Fundamentos técnicos esenciales",
                        "lessons": [
                            {
                                "title": "Control del balón",
                                "description": "Aprende a controlar el balón con diferentes partes del cuerpo",
                                "content_type": "video",
                                "content_data": json.dumps({
                                    "videos": [
                                        {
                                            "url": "https://www.youtube.com/embed/dQw4w9WgXcQ",
                                            "description": "Ejercicios básicos de control"
                                        },
                                        {
                                            "url": "https://www.youtube.com/embed/dQw4w9WgXcQ",
                                            "description": "Control con diferentes superficies"
                                        }
                                    ]
                                }),
                                "duration_minutes": 25
                            },
                            {
                                "title": "Pase y recepción",
                                "description": "Técnicas de pase y recepción efectivas",
                                "content_type": "text",
                                "content_data": json.dumps({
                                    "content": "# Pase y Recepción\n\n## Tipos de pases\n\n### Pase corto\n- Con la planta del pie\n- Para distancias cortas\n- Precisión y rapidez\n\n### Pase largo\n- Con el empeine\n- Para distancias largas\n- Potencia y precisión\n\n## Técnicas de recepción\n\n### Recepción con la planta\n- Detener el balón suavemente\n- Mantenerlo cerca del cuerpo\n\n### Recepción con el empeine\n- Amortiguar balones aéreos\n- Dirección hacia el juego\n\n## Ejercicios recomendados\n\n1. **Pases en parejas**: 10 minutos\n2. **Recepción y control**: 15 minutos\n3. **Pases en movimiento**: 20 minutos\n\nRecuerda: La práctica constante es clave para mejorar."
                                }),
                                "duration_minutes": 30
                            }
                        ]
                    }
                ]
            },
            {
                "title": "Táctica y Estrategia en el Fútbol",
                "description": "Aprende los principios tácticos y estratégicos que definen el fútbol moderno.",
                "status": "published",
                "order_index": 2,
                "sections": [
                    {
                        "title": "Principios Tácticos",
                        "description": "Fundamentos de la táctica futbolística",
                        "lessons": [
                            {
                                "title": "Principios ofensivos",
                                "description": "Conceptos básicos del ataque",
                                "content_type": "text",
                                "content_data": json.dumps({
                                    "content": "# Principios Ofensivos\n\n## Los principios del ataque\n\n### 1. Penetración\n- Buscar espacios libres\n- Avanzar con el balón\n- Pases en profundidad\n\n### 2. Movilidad\n- Desmarques constantes\n- Crear espacios\n- Sinergia entre jugadores\n\n### 3. Amplitud\n- Ocupar las bandas\n- Estirar la defensa\n- Crear espacios centrales\n\n### 4. Profundidad\n- Líneas de pase\n- Apoyo constante\n- Opciones de juego\n\n## Formaciones básicas\n\n### 4-4-2\n- Balance defensivo-ataque\n- Fácil de entender\n- Compacta\n\n### 4-3-3\n- Más ofensiva\n- Presión alta\n- Dominio en bandas\n\nLa táctica se adapta al estilo de juego y a los jugadores disponibles."
                                }),
                                "duration_minutes": 35
                            },
                            {
                                "title": "Sistemas de juego",
                                "description": "Análisis de diferentes formaciones",
                                "content_type": "url",
                                "content_data": json.dumps({
                                    "url": "https://www.fifa.com/tournaments",
                                    "description": "Recursos FIFA sobre sistemas de juego"
                                }),
                                "duration_minutes": 20
                            }
                        ]
                    }
                ]
            },
            {
                "title": "Preparación Física para Futbolistas",
                "description": "Programa completo de preparación física específica para futbolistas de todas las edades.",
                "status": "published",
                "order_index": 3,
                "sections": [
                    {
                        "title": "Condición Física",
                        "description": "Desarrollo de capacidades físicas",
                        "lessons": [
                            {
                                "title": "Resistencia y fuerza",
                                "description": "Programa de entrenamiento físico",
                                "content_type": "file",
                                "content_data": json.dumps({
                                    "url": "https://example.com/plan-entrenamiento.pdf",
                                    "filename": "Plan Entrenamiento Físico.pdf"
                                }),
                                "attachment_url": "https://example.com/plan-entrenamiento.pdf",
                                "attachment_name": "Plan Entrenamiento Físico.pdf",
                                "duration_minutes": 45
                            }
                        ]
                    }
                ]
            }
        ]
        
        # Create courses
        for course_data in courses_data:
            # Check if course already exists
            existing_courses = academia_crud.get_all_courses()
            if any(c['title'] == course_data['title'] for c in existing_courses):
                print(f"Curso '{course_data['title']}' ya existe. Saltando.")
                continue
            
            # Create course
            course_id = academia_crud.create_course(
                title=course_data['title'],
                created_by=admin_id,
                description=course_data['description'],
                status=course_data['status'],
                order_index=course_data['order_index']
            )
            print(f"✓ Creado curso: {course_data['title']} (ID: {course_id})")
            
            # Create sections and lessons
            for section_data in course_data['sections']:
                section_id = academia_crud.create_section(
                    course_id=course_id,
                    title=section_data['title'],
                    description=section_data['description'],
                    order_index=course_data['sections'].index(section_data)
                )
                print(f"  → Sección creada: {section_data['title']}")
                
                for lesson_data in section_data['lessons']:
                    lesson_id = academia_crud.create_lesson(
                        course_id=course_id,
                        section_id=section_id,
                        title=lesson_data['title'],
                        description=lesson_data['description'],
                        content_type=lesson_data['content_type'],
                        content_data=lesson_data['content_data'],
                        duration_minutes=lesson_data.get('duration_minutes'),
                        order_index=section_data['lessons'].index(lesson_data),
                        attachment_url=lesson_data.get('attachment_url'),
                        attachment_name=lesson_data.get('attachment_name')
                    )
                    print(f"    → Lección creada: {lesson_data['title']}")
        
        # Enroll some students to courses
        all_users = auth_crud.get_all_users(db)
        students = [user for user in all_users if user.role == 'alumno'][:5]  # First 5 students
        all_courses = academia_crud.get_all_courses(status='published')
        
        for student in students:
            for course in all_courses:
                try:
                    academia_crud.enroll_user(student.id, course['id'])
                    print(f"✓ Alumno {student.name} inscrito en {course['title']}")
                except Exception as e:
                    print(f"Error inscribiendo alumno: {e}")
        
    except Exception as e:
        print(f"Error creando cursos: {e}")
        db.rollback()
    finally:
        db.close()


if __name__ == "__main__":
    main()