from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand
from courses.models import (
    Category,
    Course,
    Module,
    Lesson,
    Enrollment,
    LessonProgress,
    Evaluation,
    Certificate,
)

User = get_user_model()


class Command(BaseCommand):
    help = "Poblar la base de datos de Lo Justo con datos de demostración realistas para el LMS"

    def handle(self, *args, **options):
        self.stdout.write(self.style.WARNING("⚠️ Iniciando limpieza y población de datos de demostración..."))

        # Limpiar datos anteriores
        Enrollment.objects.all().delete()
        Course.objects.all().delete()
        Category.objects.all().delete()

        # 1. Crear Usuarios Demo y Perfiles
        admin_user, _ = User.objects.get_or_create(
            username="admin",
            defaults={"email": "admin@lojusto.cl", "first_name": "Administrador", "last_name": "General", "is_staff": True, "is_superuser": True}
        )
        admin_user.set_password("lojusto2026")
        admin_user.save()
        admin_user.profile.role = 'ADMIN'
        admin_user.profile.rut = "11.111.111-1"
        admin_user.profile.company = "Lo Justo Metrología"
        admin_user.profile.position_title = "Director de Tecnología"
        admin_user.profile.save()

        tech_user, _ = User.objects.get_or_create(
            username="tecnico_carlos",
            defaults={"email": "carlos.mendoza@lojusto.cl", "first_name": "Carlos", "last_name": "Mendoza"}
        )
        tech_user.set_password("lojusto2026")
        tech_user.save()
        tech_user.profile.role = 'STUDENT'
        tech_user.profile.rut = "18.555.444-K"
        tech_user.profile.company = "Lo Justo Metrología Terreno"
        tech_user.profile.position_title = "Técnico Especialista en Calibración"
        tech_user.profile.phone = "+56 9 8765 4321"
        tech_user.profile.save()

        auditor_user, _ = User.objects.get_or_create(
            username="auditor_ana",
            defaults={"email": "ana.valdes@empresa-cliente.cl", "first_name": "Ana", "last_name": "Valdés"}
        )
        auditor_user.set_password("lojusto2026")
        auditor_user.save()
        auditor_user.profile.role = 'STUDENT'
        auditor_user.profile.rut = "16.222.333-8"
        auditor_user.profile.company = "Laboratorios Alimentos Chile S.A."
        auditor_user.profile.position_title = "Jefa de Aseguramiento de Calidad"
        auditor_user.profile.save()

        instructor_user, _ = User.objects.get_or_create(
            username="profesor_marcos",
            defaults={"email": "marcos.docente@lojusto.cl", "first_name": "Marcos", "last_name": "Sepúlveda"}
        )
        instructor_user.set_password("lojusto2026")
        instructor_user.save()
        instructor_user.profile.role = 'INSTRUCTOR'
        instructor_user.profile.rut = "12.333.444-5"
        instructor_user.profile.company = "Lo Justo Acreditación"
        instructor_user.profile.position_title = "Metrólogo Senior & Auditor ISO 17025"
        instructor_user.profile.bio = "Ingeniero Civil con más de 15 años calibrando balanzas analíticas e industriales en Chile y el extranjero."
        instructor_user.profile.save()

        manager_user, _ = User.objects.get_or_create(
            username="coordinadora_sofia",
            defaults={"email": "sofia.rrhh@lojusto.cl", "first_name": "Sofía", "last_name": "Pérez"}
        )
        manager_user.set_password("lojusto2026")
        manager_user.save()
        manager_user.profile.role = 'MANAGER'
        manager_user.profile.rut = "15.666.777-9"
        manager_user.profile.company = "Lo Justo Corporativo"
        manager_user.profile.position_title = "Coordinadora General de Formación y RRHH"
        manager_user.profile.save()

        self.stdout.write(self.style.SUCCESS("✅ Usuarios creados: admin (ADMIN), tecnico_carlos (STUDENT), auditor_ana (STUDENT), profesor_marcos (INSTRUCTOR), coordinadora_sofia (MANAGER) [Contraseña: lojusto2026]"))

        # 2. Crear Categorías
        cat_pesaje = Category.objects.create(
            title="Metrología y Pesaje",
            slug="metrologia-y-pesaje",
            description="Procedimientos estandarizados para balanzas analíticas, de precisión e industriales.",
            icon="rmx.scales-3"
        )
        cat_iso = Category.objects.create(
            title="Calidad & Normativa ISO",
            slug="calidad-y-normativa-iso",
            description="Aseguramiento metrológico y cumplimiento de requisitos ISO/IEC 17025 y OIML.",
            icon="rmx.file-list-3"
        )
        cat_seguridad = Category.objects.create(
            title="Seguridad Operativa",
            slug="seguridad-operativa",
            description="Protocolos de prevención de riesgos en laboratorios y calibraciones en terreno.",
            icon="rmx.shield-check"
        )
        cat_inst = Category.objects.create(
            title="Instrumentación Electrónica",
            slug="instrumentacion-electronica",
            description="Mantenimiento preventivo, celdas de carga e indicadores digitales de peso.",
            icon="rmx.cpu-line"
        )

        # 3. Crear Cursos
        course_balanzas = Course.objects.create(
            title="Calibración de Balanzas Analíticas y de Precisión (Clases I y II)",
            slug="calibracion-balanzas-analiticas",
            category=cat_pesaje,
            instructor=instructor_user,
            short_description="Metodología técnica para ensayos de excentricidad, repetibilidad y errores de indicación bajo NCh 44 y OIML R 76.",
            description="""Este curso capacita al personal técnico y auditores en la verificación rigurosa de balanzas de funcionamiento no automático (BFNA). 
Aprenderás a aplicar pesas patrón de clase E2 y F1, realizar el cálculo de excentricidad, determinar errores de histéresis y emitir el protocolo técnico pre-calibración.

### Objetivos del Curso:
- Comprender la clasificación de balanzas según OIML R 76 (Clase I Especial y Clase II Fina).
- Ejecutar el ensayo de repetibilidad con 6 y 10 cargas.
- Realizar la prueba de excentricidad según geometría del plato (redondo, cuadrado o triangular).
- Elaborar informes técnicos con trazabilidad al patrón nacional del INN.""",
            iso_standard="ISO/IEC 17025:2017"
        )

        course_iso = Course.objects.create(
            title="Interpretación Práctica de la Norma ISO/IEC 17025:2017",
            slug="norma-iso-17025",
            category=cat_iso,
            instructor=instructor_user,
            short_description="Requisitos generales para la competencia y gestión de laboratorios de ensayo y calibración.",
            description="""Estudio exhaustivo de la estructura, cláusulas de imparcialidad, confidencialidad, requisitos relativos a los recursos y al proceso según la norma ISO/IEC 17025.
Es fundamental para todo técnico que emite certificados en el área de metrología de Lo Justo.""",
            iso_standard="ISO/IEC 17025:2017"
        )

        course_incertidumbre = Course.objects.create(
            title="Cálculo y Estimación de Incertidumbre de Medición en Pesaje",
            slug="estimacion-incertidumbre-pesaje",
            category=cat_iso,
            instructor=instructor_user,
            short_description="Modelamiento matemático, evaluación Tipo A y Tipo B e incertidumbre expandida según GUM (JCGM 100).",
            description="""Domina la Guía para la Expresión de la Incertidumbre de Medida (GUM). Aprende a calcular contribuciones por resolución del instrumento, deriva del patrón, empuje del aire y repetibilidad en balanzas y masas.""",
            iso_standard="GUM / ISO 17025"
        )

        course_seguridad = Course.objects.create(
            title="Procedimientos de Seguridad Industrial en Calibración en Terreno",
            slug="seguridad-industrial-metrologica",
            category=cat_seguridad,
            instructor=instructor_user,
            short_description="Manejo seguro de masas patrón de 20kg y 500kg, uso de EPP industrial y protocolos en plantas químicas.",
            description="""Estándares obligatorios de seguridad en terreno para técnicos calibradores de Lo Justo. Incluye ergonomía en levantamiento de pesas patrón e ingreso a áreas clasificadas con riesgo eléctrico o químico.""",
            iso_standard="O первые NCh / ISO 45001"
        )

        course_pesas = Course.objects.create(
            title="Trazabilidad y Verificación de Masas y Pesas Patrón (OIML R 111)",
            slug="trazabilidad-pesas-patron",
            category=cat_pesaje,
            instructor=instructor_user,
            short_description="Clasificación E1, E2, F1, F2, M1. Manipulación con pinzas y guantes, y limpieza ultrasónica de pesas.",
            description="""Aprende a clasificar y conservar los patrones de masa del laboratorio. Criterios para el recálculo de densidad y susceptibilidad magnética según recomendación internacional OIML R 111.""",
            iso_standard="OIML R 111"
        )

        # 4. Crear Módulos y Lecciones para el Curso de Balanzas Analíticas
        mod1 = Module.objects.create(course=course_balanzas, title="Fundamentos Metrológicos y OIML R 76", order=1)
        Lesson.objects.create(
            module=mod1,
            title="Clasificación de Balanzas y Verificación de Condiciones Ambientales",
            slug="clasificacion-balanzas-condiciones",
            video_url="https://www.youtube.com/watch?v=dQw4w9WgXcQ",
            content="""# Clasificación y Preparación del Entorno
Antes de iniciar la calibración, el técnico debe verificar:
1. **Estabilidad Térmica:** La balanza debe llevar al menos 2 horas en la sala de metrología.
2. **Temperatura y Humedad:** Registrar con termo-higrómetro calibrado. Rango ideal: 18°C - 24°C, Humedad Relativa < 65%.
3. **Nivelación y Cero:** Verificar burbuja de nivel e iniciar tara pre-calentamiento.""",
            order=1
        )
        Lesson.objects.create(
            module=mod1,
            title="Selección y Cuidado de Pesas Patrón (Clases E2 y F1)",
            slug="seleccion-cuidado-pesas-patron",
            video_url="https://www.youtube.com/watch?v=dQw4w9WgXcQ",
            content="""# Manipulación de Masas Patrón
- **Nunca tocar con las manos desnudas:** Usar pinzas con puntas de teflón para pesas menores a 500g, o guantes de algodón/nitrilo limpio para pesas mayores.
- **Aclimatación:** Las pesas patrón deben estar térmicamente equilibradas con el plato de la balanza.""",
            order=2
        )

        mod2 = Module.objects.create(course=course_balanzas, title="Ejecución Práctica de Ensayos", order=2)
        Lesson.objects.create(
            module=mod2,
            title="Ensayo de Excentricidad (Carga en Cuadrantes)",
            slug="ensayo-excentricidad-cuadrantes",
            video_url="https://www.youtube.com/watch?v=dQw4w9WgXcQ",
            content="""# Prueba de Excentricidad
El ensayo determina el error angular por descentramiento de la masa en el plato:
- Carga de prueba: Aproximadamente 1/3 de la capacidad máxima ($Max / 3$).
- Orden de aplicación: Centro (1), Frontal Izquierdo (2), Trasero Izquierdo (3), Trasero Derecho (4), Frontal Derecho (5), y nuevamente Centro (6).""",
            order=1
        )
        Lesson.objects.create(
            module=mod2,
            title="Ensayo de Repetibilidad y Errores de Indicación (Pesada Ascendente/Descendente)",
            slug="ensayo-repetibilidad-errores",
            video_url="https://www.youtube.com/watch?v=dQw4w9WgXcQ",
            content="""# Repetibilidad y Linealidad
1. **Repetibilidad:** Realizar 10 pesadas consecutivas con la misma carga (generalmente al 50% y al 100% del Max) y calcular la desviación estándar ($s$).
2. **Errores de Indicación:** Evaluar al menos 5 puntos en todo el rango (0, Min, 50% Max, 75% Max, Max).""",
            order=2
        )

        # Módulos y lecciones para ISO 17025
        mod_iso1 = Module.objects.create(course=course_iso, title="Estructura de la Norma y Gestión de Competencias", order=1)
        Lesson.objects.create(
            module=mod_iso1,
            title="Cláusula 6.2: Personal y Matriz de Competencias",
            slug="clausula-62-personal",
            content="Todo el personal que realiza actividades de laboratorio debe ser competente y actuar de manera imparcial. Este LMS es parte integral de la trazabilidad formativa de Lo Justo.",
            order=1
        )
        Lesson.objects.create(
            module=mod_iso1,
            title="Cláusula 7.8: Informe de Resultados y Protocolos de Calibración",
            slug="clausula-78-informe-resultados",
            content="Requisitos que debe cumplir un certificado de calibración oficial: declaración de incertidumbre, trazabilidad, condiciones ambientales y firma técnica autorizada.",
            order=2
        )

        # 5. Crear Evaluaciones
        Evaluation.objects.create(
            course=course_balanzas,
            title="Examen Final de Calibración de Balanzas Analíticas",
            questions=[
                {
                    "id": 1,
                    "text": "¿Qué clase de pesas patrón OIML R 111 se debe utilizar normalmente para calibrar una balanza analítica Clase I (d = 0.1 mg)?",
                    "options": ["Clase M1 o M2", "Clase E2 o F1", "Clase F2", "Cualquier pesa de fierro fundido"],
                    "correct": 1
                },
                {
                    "id": 2,
                    "text": "En el ensayo de excentricidad para un plato redondo o cuadrado, ¿qué fracción de la capacidad máxima (Max) se recomienda aplicar?",
                    "options": ["10% del Max", "33% (aprox. 1/3) del Max", "100% del Max", "500 gramos exactos siempre"],
                    "correct": 1
                },
                {
                    "id": 3,
                    "text": "¿Cuál es el tiempo mínimo recomendado para estabilización térmica de una balanza analítica antes de calibrar?",
                    "options": ["5 minutos", "Al menos 2 horas con energía conectada", "15 segundos", "No requiere estabilización si la sala tiene aire acondicionado"],
                    "correct": 1
                }
            ],
            passing_score=80
        )

        Evaluation.objects.create(
            course=course_iso,
            title="Evaluación de Auditoría y Cláusulas ISO 17025:2017",
            questions=[
                {
                    "id": 1,
                    "text": "¿Qué cláusula de la norma ISO/IEC 17025:2017 trata específicamente sobre los requisitos del personal técnico y su competencia?",
                    "options": ["Cláusula 4.1", "Cláusula 6.2", "Cláusula 8.9", "Cláusula 3.2"],
                    "correct": 1
                },
                {
                    "id": 2,
                    "text": "Si un cliente solicita modificar un resultado ya emitido en un certificado de calibración, ¿qué se debe hacer según la norma?",
                    "options": ["Borrar el PDF original y subir uno con la fecha antigua", "Emitir una enmienda o un nuevo certificado con una referencia clara al original que reemplaza", "Negarse rotundamente y cancelar la cuenta del cliente", "Escribir la corrección con bolígrafo encima del papel original"],
                    "correct": 1
                }
            ],
            passing_score=80
        )

        # 6. Crear Matrículas, Progreso y Diploma de Demostración
        # Matricular a Carlos en Balanzas Analíticas
        enroll_carlos = Enrollment.objects.create(user=tech_user, course=course_balanzas)
        for lesson in course_balanzas.modules.first().lessons.all():
            LessonProgress.objects.create(enrollment=enroll_carlos, lesson=lesson, is_completed=True)

        # Matricular a Ana en ISO 17025 y darle todas las lecciones completadas y UN DIPLOMA QR VERIFICABLE
        enroll_ana = Enrollment.objects.create(user=auditor_user, course=course_iso)
        for mod in course_iso.modules.all():
            for lesson in mod.lessons.all():
                LessonProgress.objects.create(enrollment=enroll_ana, lesson=lesson, is_completed=True)

        # Emitir diploma con código específico para demostración rápida en QR
        cert_ana = Certificate.objects.create(
            enrollment=enroll_ana,
            certificate_code="LJ-2026-MET1"
        )

        self.stdout.write(self.style.SUCCESS(f"🏆 Diploma Demo generado para {auditor_user.get_full_name()} (Código: {cert_ana.certificate_code})"))
        self.stdout.write(self.style.SUCCESS("✨ ¡Población de datos completada con éxito!"))
