import os
import django
from django.utils.text import slugify

# Configurar Django para script independiente
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lms.settings')
django.setup()

from django.contrib.auth import get_user_model
from users.models import UserProfile
from courses.models import Category, Course, Module, Lesson, Evaluation
from campus.models import Enrollment

User = get_user_model()

def run_seed():
    print("Iniciando generación de datos de prueba...")

    # 1. Crear Categorías
    cat_calidad, _ = Category.objects.update_or_create(slug="calidad", defaults={'title': "Escuela de Calidad y Laboratorios", 'description': 'Gestión de Calidad ISO 9001 e ISO/IEC 17025'})
    cat_metrologia, _ = Category.objects.update_or_create(slug="metrologia", defaults={'title': "Escuela de Metrología", 'description': 'Metrología Legal e Industrial'})
    cat_materiales, _ = Category.objects.update_or_create(slug="materiales", defaults={'title': "Escuela de Materiales de Referencia y Ensayos", 'description': 'Uso y selección de MRC'})

    # 2. Crear Cursos
    c1, _ = Course.objects.update_or_create(
        slug="interpretacion-iso-17025",
        defaults={
            'title': "Interpretación Práctica de la ISO/IEC 17025",
            'category': cat_calidad,
            'short_description': 'Aprende los requisitos técnicos y de gestión para laboratorios.',
            'description': 'Curso completo para comprender la norma ISO/IEC 17025:2017 aplicable a laboratorios de ensayo y calibración.',
            'iso_standard': 'ISO/IEC 17025',
            'is_published': True,
            'price': 0.00,
            'discount_price': None
        }
    )

    c2, _ = Course.objects.update_or_create(
        slug="metrologia-masas",
        defaults={
            'title': "Lectura e interpretación de certificados de calibración",
            'category': cat_metrologia,
            'short_description': 'Conceptos fundamentales de metrología.',
            'description': 'Aprende a calibrar, verificar y entender la incertidumbre en equipos.',
            'iso_standard': 'OIML / ISO 17025',
            'is_published': True,
            'price': 0.00,
            'discount_price': None
        }
    )

    c3, _ = Course.objects.update_or_create(
        slug="materiales-referencia",
        defaults={
            'title': "Materiales de Referencia Certificados (MRC/PMR)",
            'category': cat_materiales,
            'short_description': 'Especialízate en el uso, selección y producción de materiales de referencia.',
            'description': 'Asegura mediciones confiables y trazabilidad química.',
            'iso_standard': 'ISO 17034',
            'is_published': True,
            'price': 0.00,
            'discount_price': None
        }
    )

    # 3. Crear Módulos y Lecciones de prueba para todos los cursos
    # Curso 1: ISO 17025
    mod1_c1, _ = Module.objects.get_or_create(course=c1, title="Módulo 1: Introducción a ISO/IEC 17025", order=1)
    Lesson.objects.get_or_create(module=mod1_c1, slug="conceptos-generales", defaults={'title': "Conceptos Generales y Estructura", 'order': 1, 'video_url': 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', 'content': 'Guía y fundamentos de la norma ISO/IEC 17025:2017 para laboratorios de ensayo y calibración.'})
    Lesson.objects.get_or_create(module=mod1_c1, slug="requisitos-gestion", defaults={'title': "Requisitos del Sistema de Gestión", 'order': 2, 'content': 'Estudio detallado de la imparcialidad, confidencialidad y control documental.'})

    mod2_c1, _ = Module.objects.get_or_create(course=c1, title="Módulo 2: Requisitos Técnicos y Operativos", order=2)
    Lesson.objects.get_or_create(module=mod2_c1, slug="personal-equipamiento", defaults={'title': "Personal, Instalaciones y Equipos", 'order': 1, 'content': 'Requisitos de competencia técnica, trazabilidad metrológica y mantenimiento de patrones.'})

    # Curso 2: Metrología y Certificados
    mod1_c2, _ = Module.objects.get_or_create(course=c2, title="Módulo 1: Fundamentos de Metrología", order=1)
    Lesson.objects.get_or_create(module=mod1_c2, slug="terminologia-vim", defaults={'title': "Vocabulario Internacional de Metrología (VIM)", 'order': 1, 'video_url': 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', 'content': 'Definiciones esenciales: calibración, verificación, ajuste, error máximo permitido e histéresis.'})
    Lesson.objects.get_or_create(module=mod1_c2, slug="lectura-certificados", defaults={'title': "Estructura y Lectura de Certificados", 'order': 2, 'content': 'Cómo interpretar tablas de calibración, curva de corrección y condiciones ambientales.'})

    mod2_c2, _ = Module.objects.get_or_create(course=c2, title="Módulo 2: Estimación y Evaluación de Incertidumbre", order=2)
    Lesson.objects.get_or_create(module=mod2_c2, slug="incertidumbre-expandida", defaults={'title': "Incertidumbre Combinada y Expandida (GUM)", 'order': 1, 'content': 'Cálculo de fuentes de incertidumbre Tipo A y Tipo B, factor de cobertura k=2.'})

    # Curso 3: Materiales de Referencia (MRC)
    mod1_c3, _ = Module.objects.get_or_create(course=c3, title="Módulo 1: Fundamentos de Materiales de Referencia", order=1)
    Lesson.objects.get_or_create(module=mod1_c3, slug="clasificacion-mrc", defaults={'title': "Definición y Clasificación ISO 17034", 'order': 1, 'video_url': 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', 'content': 'Diferencia entre Material de Referencia (MR) y Material de Referencia Certificado (MRC).'})
    Lesson.objects.get_or_create(module=mod1_c3, slug="seleccion-adquisicion", defaults={'title': "Selección, Almacenamiento y Trazabilidad", 'order': 2, 'content': 'Criterios de homogeneidad, estabilidad y cálculo de vida útil del material.'})

    mod2_c3, _ = Module.objects.get_or_create(course=c3, title="Módulo 2: Aplicación Práctica en Ensayo Químico", order=2)
    Lesson.objects.get_or_create(module=mod2_c3, slug="control-calidad-analitico", defaults={'title': "Cartas de Control y Validación Analítica", 'order': 1, 'content': 'Uso de MRC en verificación de sesgo analítico y gráficos Shewhart.'})

    # 4. Crear Evaluaciones y Preguntas de Certificación
    Evaluation.objects.update_or_create(
        course=c1,
        title="Examen de Certificación ISO/IEC 17025",
        defaults={
            'passing_score': 75,
            'questions': [
                {
                    "id": 1,
                    "text": "¿Cuál es el objetivo primordial de la norma ISO/IEC 17025:2017?",
                    "options": [
                        "Acreditar la competencia técnica y validez de resultados de ensayo y calibración",
                        "Fijar precios de los servicios de laboratorio",
                        "Homologar marcas de balanzas y pesas",
                        "Vender materiales de calibración"
                    ],
                    "correct": 0
                },
                {
                    "id": 2,
                    "text": "La trazabilidad metrológica se asegura mediante:",
                    "options": [
                        "Una factura de compra del instrumento",
                        "Una cadena ininterrumpida y documentada de calibraciones a patrones nacionales/internacionales",
                        "La garantía del fabricante del equipo",
                        "El uso de hojas de cálculo sin validar"
                    ],
                    "correct": 1
                }
            ]
        }
    )

    Evaluation.objects.update_or_create(
        course=c2,
        title="Evaluación Práctica: Lectura de Certificados de Calibración",
        defaults={
            'passing_score': 75,
            'questions': [
                {
                    "id": 1,
                    "text": "¿Qué representa la Incertidumbre Expandida (U) con factor k=2?",
                    "options": [
                        "Un nivel de confianza aproximado del 95% en la medición",
                        "El error máximo tolerado del patrón",
                        "El doble del peso de calibración",
                        "El costo total del servicio"
                    ],
                    "correct": 0
                },
                {
                    "id": 2,
                    "text": "Si la corrección en un certificado es +0.02 g, el valor corregido es:",
                    "options": [
                        "Lectura del equipo + Corrección (+0.02 g)",
                        "Lectura del equipo - Corrección (+0.02 g)",
                        "Lectura multiplicada por 0.02",
                        "Incierto sin repetir el pesaje"
                    ],
                    "correct": 0
                }
            ]
        }
    )

    Evaluation.objects.update_or_create(
        course=c3,
        title="Examen de Validación con Materiales de Referencia (ISO 17034)",
        defaults={
            'passing_score': 75,
            'questions': [
                {
                    "id": 1,
                    "text": "¿Qué diferencia a un MRC (Material de Referencia Certificado) de un MR común?",
                    "options": [
                        "El MRC viene acompañado de un certificado con valor de propiedad, incertidumbre y trazabilidad",
                        "El MRC es más barato",
                        "El MRC no tiene fecha de caducidad",
                        "No existe diferencia técnica"
                    ],
                    "correct": 0
                }
            ]
        }
    )

    # 5. Crear Usuarios Demo (Los que aparecen en el Login)
    demo_users = [
        {'username': 'tecnico_carlos', 'email': 'carlos@lojusto.cl', 'first_name': 'Carlos', 'last_name': 'Mendoza', 'role': 'STUDENT'},
        {'username': 'profesor_marcos', 'email': 'marcos@lojusto.cl', 'first_name': 'Marcos', 'last_name': 'Docente', 'role': 'INSTRUCTOR'},
        {'username': 'coordinadora_sofia', 'email': 'sofia@lojusto.cl', 'first_name': 'Sofía', 'last_name': 'Admin', 'role': 'MANAGER'},
    ]

    for data in demo_users:
        if not User.objects.filter(username=data['username']).exists():
            user = User.objects.create_user(
                username=data['username'],
                email=data['email'],
                password='lojusto2026',
                first_name=data['first_name'],
                last_name=data['last_name']
            )
            profile, _ = UserProfile.objects.get_or_create(user=user)
            profile.role = data['role']
            profile.save()
            print(f"Usuario demo creado: {data['username']} (Rol: {data['role']})")
            
            # Inscribir al alumno en cursos para probar
            if data['role'] == 'STUDENT':
                Enrollment.objects.get_or_create(user=user, course=c1)
                Enrollment.objects.get_or_create(user=user, course=c2)
        else:
            print(f"El usuario demo {data['username']} ya existe.")

    print("Datos de prueba generados exitosamente.")

run_seed()
