CREATE OR REPLACE FUNCTION public.fn_professor_cancel_session(p_professor_id bigint, p_session_id integer, p_reason text DEFAULT ''::text)
 RETURNS jsonb
 LANGUAGE plpgsql
AS $function$
DECLARE
  v_zoom_meeting_id text;
  v_scheduled_at    timestamptz;
  v_course_id       integer;
  v_course_name     text;
  v_course_language text;
  v_participants    jsonb;
BEGIN
  IF NOT public.fn_is_active_professor(p_professor_id) THEN
    RETURN jsonb_build_object('error', 'No tienes perfil de profesor activo.');
  END IF;

  UPDATE public.sessions
  SET status = 'CANCELLED'
  WHERE session_id = p_session_id
    AND status    != 'CANCELLED'
  RETURNING zoom_meeting_id, scheduled_at, course_id
  INTO v_zoom_meeting_id, v_scheduled_at, v_course_id;

  IF NOT FOUND THEN
    RETURN jsonb_build_object('error', 'Sesión no encontrada o ya cancelada.');
  END IF;

  INSERT INTO public.session_log (session_id, action, performed_by, reason)
  VALUES (p_session_id, 'CANCELLED', p_professor_id, NULLIF(trim(p_reason), ''));

  SELECT name, language INTO v_course_name, v_course_language
  FROM public.courses WHERE course_id = v_course_id;

  SELECT jsonb_agg(jsonb_build_object(
    'email',     sp.email,
    'full_name', sp.full_name,
    'country',   COALESCE(pa.country::text, g.country::text)
  ))
  INTO v_participants
  FROM public.session_participants sp
  LEFT JOIN public.partners pa ON pa.partner_id = sp.partner_id
  LEFT JOIN public.guests   g  ON g.email = sp.email AND sp.partner_id IS NULL
  WHERE sp.session_id = p_session_id;

  RETURN jsonb_build_object(
    'success',         true,
    'zoom_meeting_id', v_zoom_meeting_id,
    'scheduled_at',    v_scheduled_at,
    'course_id',       v_course_id,
    'course_name',     v_course_name,
    'course_language', v_course_language,
    'participants',    COALESCE(v_participants, '[]'::jsonb)
  );
END;
$function$
;
