CREATE OR REPLACE FUNCTION public.fn_admin_toggle_level(p_level_id integer, p_course_id integer DEFAULT 1)
 RETURNS jsonb
 LANGUAGE plpgsql
AS $function$
DECLARE
    v_current_active BOOLEAN;
    v_enrolled       INT;
BEGIN
    -- Level 0 is system-reserved
    IF p_level_id = 0 THEN
        RETURN jsonb_build_object(
            'success', false,
            'error',   'El nivel de Invitados (0) es reservado del sistema y no puede desactivarse.'
        );
    END IF;

    SELECT active INTO v_current_active
    FROM   public.levels
    WHERE  level_id = p_level_id AND course_id = p_course_id;

    IF NOT FOUND THEN
        RETURN jsonb_build_object('success', false, 'error', 'Nivel no encontrado.');
    END IF;

    -- If deactivating, check for active enrollments first
    IF v_current_active THEN
        SELECT COUNT(*) INTO v_enrolled
        FROM   public.student_profiles
        WHERE  level_id  = p_level_id
          AND  course_id = p_course_id
          AND  status    = 'ACTIVE';

        IF v_enrolled > 0 THEN
            RETURN jsonb_build_object(
                'success', false,
                'error',   'No se puede desactivar: hay ' || v_enrolled || ' alumnos activos en este nivel.'
            );
        END IF;
    END IF;

    UPDATE public.levels
    SET    active = NOT v_current_active
    WHERE  level_id = p_level_id AND course_id = p_course_id;

    RETURN jsonb_build_object(
        'success',  true,
        'level_id', p_level_id,
        'active',   NOT v_current_active
    );
EXCEPTION WHEN OTHERS THEN
    RETURN jsonb_build_object('success', false, 'error', SQLERRM);
END;
$function$
;
