CREATE OR REPLACE FUNCTION public.fn_professor_list_courses(p_professor_id bigint, p_is_superadmin_active boolean DEFAULT false)
 RETURNS TABLE(course_id integer, name text, language text, active boolean, access_level text)
 LANGUAGE plpgsql
 STABLE
AS $function$
BEGIN
  -- When superadmin is active in the current JWT session, return all courses.
  -- Distinguish explicit course_admin assignments from generic superadmin access.
  IF p_is_superadmin_active THEN
    RETURN QUERY
      SELECT c.course_id, c.name::text, c.language::text, c.active,
        CASE
          WHEN ca.professor_id IS NOT NULL THEN 'course_admin'
          ELSE 'superadmin'
        END::text AS access_level
      FROM public.courses c
      LEFT JOIN public.course_admins ca
             ON ca.professor_id = p_professor_id
            AND ca.course_id    = c.course_id
      ORDER BY c.name;
    RETURN;
  END IF;

  -- Regular professor: courses from explicit professor assignments OR course_admin assignments.
  RETURN QUERY
    SELECT
      c.course_id,
      c.name::text,
      c.language::text,
      c.active,
      CASE
        WHEN ca.professor_id IS NOT NULL THEN 'course_admin'
        ELSE 'professor'
      END::text AS access_level
    FROM (
      SELECT cpl.course_id FROM public.course_professor_levels cpl WHERE cpl.professor_id = p_professor_id
      UNION
      SELECT caa.course_id FROM public.course_admins caa          WHERE caa.professor_id = p_professor_id
    ) assigned
    JOIN public.courses c ON c.course_id = assigned.course_id
    LEFT JOIN public.course_admins ca
           ON ca.professor_id = p_professor_id
          AND ca.course_id    = assigned.course_id
    ORDER BY c.name;
END;
$function$
;
