-- =====================================================
-- Seed: social_features.classrooms (PROD)
-- Description: Aulas demo para testing y demostraciones
-- Environment: PRODUCTION
-- Dependencies: social_features.schools, auth_management.profiles
-- Order: 02
-- Created: 2025-01-11
-- Version: 2.0 (Actualizado para alineación con DDL)
-- =====================================================
--
-- AULAS INCLUIDAS:
-- - Sin Asignar (DEFAULT - Sistema) ← NUEVO: Para asignación automática
-- - 5to A (Escuela Marie Curie, Profesor 1)
-- - 5to B (Escuela Marie Curie, Profesor 2)
-- - 6to A (Escuela Marie Curie, Profesor 1)
-- - Aula de Pruebas (IEI, Director)
-- - Aula Demo Parent Portal (IEI, Profesor 2)
--
-- TOTAL: 6 aulas (1 sistema + 5 demo)
--
-- IMPORTANTE: Estas aulas están asociadas a las escuelas y profesores demo.
--
-- CAMBIOS v2.0:
-- - Agregado tenant_id (requerido)
-- - Removido status (columna legacy)
-- - Actualizada estructura de bloques DO $$
-- =====================================================

SET search_path TO social_features, auth_management, public;

-- =====================================================
-- Obtener tenant_id y validar dependencias
-- =====================================================

DO $$
DECLARE
    v_tenant_id UUID;
    v_school_count INTEGER;
    v_teacher_count INTEGER;
BEGIN
    -- Obtener el tenant principal
    SELECT id INTO v_tenant_id
    FROM auth_management.tenants
    WHERE name = 'GAMILIT Platform'
    LIMIT 1;

    IF v_tenant_id IS NULL THEN
        RAISE EXCEPTION 'Tenant "GAMILIT Platform" no encontrado. Ejecutar primero seed de tenants.';
    END IF;

    -- Validar que existan escuelas
    SELECT COUNT(*) INTO v_school_count
    FROM social_features.schools;

    IF v_school_count = 0 THEN
        RAISE EXCEPTION 'No hay escuelas. Ejecutar primero seed de schools.';
    END IF;

    -- Validar que existan profesores
    SELECT COUNT(*) INTO v_teacher_count
    FROM auth_management.profiles
    WHERE email IN ('teacher@gamilit.com', 'teacher2@gamilit.com', 'director@gamilit.com');

    IF v_teacher_count = 0 THEN
        RAISE WARNING 'No se encontraron profesores demo. Las aulas se crearán pero pueden tener profesores inválidos.';
    END IF;

    RAISE NOTICE 'Usando tenant_id: %', v_tenant_id;
    RAISE NOTICE 'Escuelas disponibles: %', v_school_count;
    RAISE NOTICE 'Profesores demo disponibles: %', v_teacher_count;

-- =====================================================
-- INSERT: Aulas Demo
-- =====================================================

INSERT INTO social_features.classrooms (
    id,
    school_id,
    tenant_id,
    teacher_id,
    name,
    code,
    grade_level,
    section,
    subject,
    description,
    capacity,
    current_students_count,
    start_date,
    end_date,
    schedule,
    is_active,
    settings,
    metadata,
    created_at,
    updated_at
) VALUES

-- =====================================================
-- Aula 0: CLASSROOM DEFAULT (Sistema - Sin Asignar)
-- IMPORTANTE: Este classroom es usado automáticamente para
-- asignar estudiantes nuevos que aún no tienen aula.
-- =====================================================
(
    '00000000-0000-0000-0000-000000000001'::uuid,  -- UUID predecible para default
    '50000000-0000-0000-0000-000000000001'::uuid,  -- Escuela Marie Curie (default)
    v_tenant_id,
    'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,  -- Teacher default (teacher@gamilit.com)
    'Sin Asignar - Aula Default',
    'DEFAULT',
    'todos',  -- Todos los niveles
    'DEFAULT',
    'General',
    'Aula de sistema para estudiantes pendientes de asignación. Los administradores y profesores pueden reasignar estudiantes a aulas específicas.',
    999,  -- Capacidad alta para no limitar
    0,
    '2025-01-01'::date,
    '2099-12-31'::date,  -- Sin fecha de fin
    jsonb_build_object(
        'days', jsonb_build_array('Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes'),
        'time', 'flexible',
        'room', 'Virtual',
        'weekly_hours', 0
    ),
    true,
    jsonb_build_object(
        'allow_student_self_enrollment', false,
        'enable_gamification', true,
        'require_parental_consent', false,
        'grading_system', 'none',
        'attendance_required', false,
        'is_system_classroom', true
    ),
    jsonb_build_object(
        'is_default', true,
        'system_classroom', true,
        'auto_assignment', true,
        'description', 'Classroom para asignación automática de estudiantes nuevos'
    ),
    gamilit.now_mexico(),
    gamilit.now_mexico()
),

-- =====================================================
-- Aula 1: 5to A - Escuela Marie Curie (Profesor 1)
-- =====================================================
(
    '60000000-0000-0000-0000-000000000001'::uuid,
    '50000000-0000-0000-0000-000000000001'::uuid,  -- Escuela Marie Curie
    v_tenant_id,
    'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,  -- Profesor 1 (teacher@gamilit.com)
    '5to A - Comprensión Lectora',
    '5A-COMP-2025',
    '5',
    'A',
    'Comprensión Lectora',
    'Grupo de 5to grado, sección A. Enfoque en comprensión literal e inferencial.',
    35,
    2,  -- 2 estudiantes inicialmente
    '2025-08-15'::date,
    '2026-07-15'::date,
    jsonb_build_object(
        'days', jsonb_build_array('Lunes', 'Miércoles', 'Viernes'),
        'time', '08:00-09:30',
        'room', 'Aula 501',
        'weekly_hours', 4.5
    ),
    true,
    jsonb_build_object(
        'allow_student_self_enrollment', false,
        'enable_gamification', true,
        'require_parental_consent', true,
        'grading_system', 'numerical',
        'attendance_required', true,
        'homework_policy', jsonb_build_object(
            'frequency', 'weekly',
            'submission_platform', 'gamilit',
            'late_penalty', 10
        )
    ),
    jsonb_build_object(
        'academic_year', '2025-2026',
        'demo_classroom', true
    ),
    gamilit.now_mexico(),
    gamilit.now_mexico()
),

-- =====================================================
-- Aula 2: 5to B - Escuela Marie Curie (Profesor 2)
-- =====================================================
(
    '60000000-0000-0000-0000-000000000002'::uuid,
    '50000000-0000-0000-0000-000000000001'::uuid,  -- Escuela Marie Curie
    v_tenant_id,
    'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,  -- Profesor 2 (teacher2@gamilit.com)
    '5to B - Lectura Digital',
    '5B-DIGI-2025',
    '5',
    'B',
    'Lectura Digital',
    'Grupo de 5to grado, sección B. Enfoque en competencias digitales y multimedia.',
    35,
    1,
    '2025-08-15'::date,
    '2026-07-15'::date,
    jsonb_build_object(
        'days', jsonb_build_array('Martes', 'Jueves'),
        'time', '10:00-11:30',
        'room', 'Lab Cómputo 1',
        'weekly_hours', 3
    ),
    true,
    jsonb_build_object(
        'allow_student_self_enrollment', false,
        'enable_gamification', true,
        'require_parental_consent', true,
        'grading_system', 'numerical',
        'attendance_required', true,
        'technology_requirements', jsonb_build_object(
            'devices', 'tablets',
            'software', jsonb_build_array('GAMILIT Platform', 'Browser')
        )
    ),
    jsonb_build_object(
        'academic_year', '2025-2026',
        'demo_classroom', true
    ),
    gamilit.now_mexico(),
    gamilit.now_mexico()
),

-- =====================================================
-- Aula 3: 6to A - Escuela Marie Curie (Profesor 1)
-- =====================================================
(
    '60000000-0000-0000-0000-000000000003'::uuid,
    '50000000-0000-0000-0000-000000000001'::uuid,  -- Escuela Marie Curie
    v_tenant_id,
    'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,  -- Profesor 1
    '6to A - Producción de Textos',
    '6A-PROD-2025',
    '6',
    'A',
    'Producción de Textos',
    'Grupo de 6to grado, sección A. Enfoque en escritura creativa y argumentativa.',
    35,
    1,
    '2025-08-15'::date,
    '2026-07-15'::date,
    jsonb_build_object(
        'days', jsonb_build_array('Lunes', 'Miércoles', 'Viernes'),
        'time', '09:45-11:15',
        'room', 'Aula 601',
        'weekly_hours', 4.5
    ),
    true,
    jsonb_build_object(
        'allow_student_self_enrollment', false,
        'enable_gamification', true,
        'require_parental_consent', true,
        'grading_system', 'numerical',
        'attendance_required', true,
        'writing_portfolio', true
    ),
    jsonb_build_object(
        'academic_year', '2025-2026',
        'demo_classroom', true
    ),
    gamilit.now_mexico(),
    gamilit.now_mexico()
),

-- =====================================================
-- Aula 4: Aula de Pruebas - IEI (Director)
-- =====================================================
(
    '60000000-0000-0000-0000-000000000004'::uuid,
    '50000000-0000-0000-0000-000000000002'::uuid,  -- Instituto IEI
    v_tenant_id,
    'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,  -- Director (director@gamilit.com)
    'Aula de Pruebas - Todos los Niveles',
    'TEST-ALL-2025',
    'variable',
    'TEST',
    'Testing y Demos',
    'Aula para pruebas técnicas y demostraciones del sistema GAMILIT.',
    50,
    0,
    '2025-01-01'::date,
    '2025-12-31'::date,
    jsonb_build_object(
        'days', jsonb_build_array('Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes'),
        'time', 'flexible',
        'room', 'Virtual',
        'weekly_hours', 10
    ),
    true,
    jsonb_build_object(
        'allow_student_self_enrollment', true,
        'enable_gamification', true,
        'require_parental_consent', false,
        'grading_system', 'pass_fail',
        'attendance_required', false,
        'testing_environment', true
    ),
    jsonb_build_object(
        'academic_year', '2025',
        'demo_classroom', true,
        'environment', 'testing'
    ),
    gamilit.now_mexico(),
    gamilit.now_mexico()
),

-- =====================================================
-- Aula 5: Parent Portal Demo - IEI (Profesor 2)
-- =====================================================
(
    '60000000-0000-0000-0000-000000000005'::uuid,
    '50000000-0000-0000-0000-000000000002'::uuid,  -- Instituto IEI
    v_tenant_id,
    'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,  -- Profesor 2
    'Demo Parent Portal - 4to A',
    '4A-PARENT-2025',
    '4',
    'A',
    'Comprensión General',
    'Aula demo para mostrar funcionalidad de Parent Portal con comunicación padre-maestro.',
    30,
    0,
    '2025-08-15'::date,
    '2026-06-30'::date,
    jsonb_build_object(
        'days', jsonb_build_array('Lunes', 'Miércoles', 'Viernes'),
        'time', '08:00-09:30',
        'room', 'Aula 401',
        'weekly_hours', 4.5
    ),
    true,
    jsonb_build_object(
        'allow_student_self_enrollment', false,
        'enable_gamification', true,
        'require_parental_consent', true,
        'grading_system', 'numerical',
        'attendance_required', true,
        'parent_portal_features', jsonb_build_object(
            'notifications', true,
            'progress_reports', true,
            'messaging', true,
            'calendar', true
        )
    ),
    jsonb_build_object(
        'academic_year', '2025-2026',
        'demo_classroom', true,
        'parent_portal_demo', true
    ),
    gamilit.now_mexico(),
    gamilit.now_mexico()
)

ON CONFLICT (code) DO UPDATE SET
    name = EXCLUDED.name,
    description = EXCLUDED.description,
    capacity = EXCLUDED.capacity,
    current_students_count = EXCLUDED.current_students_count,
    start_date = EXCLUDED.start_date,
    end_date = EXCLUDED.end_date,
    schedule = EXCLUDED.schedule,
    is_active = EXCLUDED.is_active,
    settings = EXCLUDED.settings,
    metadata = EXCLUDED.metadata,
    updated_at = gamilit.now_mexico();

END $$;

-- =====================================================
-- Verification Query
-- =====================================================

DO $$
DECLARE
    classroom_count INTEGER;
    marie_curie_count INTEGER;
    iei_count INTEGER;
BEGIN
    SELECT COUNT(*) INTO classroom_count
    FROM social_features.classrooms
    WHERE metadata->>'demo_classroom' = 'true';

    SELECT COUNT(*) INTO marie_curie_count
    FROM social_features.classrooms c
    JOIN social_features.schools s ON c.school_id = s.id
    WHERE s.code = 'EP-MC-CDMX' AND c.metadata->>'demo_classroom' = 'true';

    SELECT COUNT(*) INTO iei_count
    FROM social_features.classrooms c
    JOIN social_features.schools s ON c.school_id = s.id
    WHERE s.code = 'IEI-GDL' AND c.metadata->>'demo_classroom' = 'true';

    RAISE NOTICE '========================================';
    RAISE NOTICE 'AULAS DEMO CREADAS EXITOSAMENTE';
    RAISE NOTICE '========================================';
    RAISE NOTICE 'Total aulas: %', classroom_count;
    RAISE NOTICE '  - Marie Curie: %', marie_curie_count;
    RAISE NOTICE '  - IEI: %', iei_count;
    RAISE NOTICE '========================================';

    IF classroom_count >= 5 THEN
        RAISE NOTICE '✓ Todas las aulas fueron creadas correctamente (incluyendo DEFAULT)';
    ELSE
        RAISE WARNING '⚠ Se esperaban al menos 5 aulas, se crearon %', classroom_count;
    END IF;
END $$;

-- =====================================================
-- SYNC teacher_classrooms (many-to-many)
-- =====================================================
-- Asegurar que todos los classrooms tienen su entrada en teacher_classrooms
-- Esto es necesario porque algunos servicios usan classrooms.teacher_id
-- y otros usan la tabla teacher_classrooms
-- =====================================================

INSERT INTO social_features.teacher_classrooms (id, teacher_id, classroom_id, tenant_id, role, assigned_at, created_at)
SELECT
    gen_random_uuid(),
    c.teacher_id,
    c.id,
    c.tenant_id,
    'owner',
    c.created_at,
    NOW()
FROM social_features.classrooms c
WHERE c.teacher_id IS NOT NULL
ON CONFLICT DO NOTHING;

-- =====================================================
-- Listado de aulas
-- =====================================================

DO $$
DECLARE
    classroom_record RECORD;
    tc_count INTEGER;
BEGIN
    -- Contar teacher_classrooms sincronizados
    SELECT COUNT(*) INTO tc_count FROM social_features.teacher_classrooms;

    RAISE NOTICE '';
    RAISE NOTICE 'Listado de aulas demo:';
    RAISE NOTICE '========================================';

    FOR classroom_record IN
        SELECT c.name, c.code, s.name as school_name, c.grade_level, c.section
        FROM social_features.classrooms c
        JOIN social_features.schools s ON c.school_id = s.id
        WHERE c.metadata->>'demo_classroom' = 'true'
        ORDER BY s.name, c.grade_level, c.section
    LOOP
        RAISE NOTICE '  - % (%) - % %° %',
            classroom_record.name,
            classroom_record.code,
            classroom_record.school_name,
            classroom_record.grade_level,
            classroom_record.section;
    END LOOP;

    RAISE NOTICE '========================================';
    RAISE NOTICE 'teacher_classrooms sincronizados: %', tc_count;
END $$;
