-- Extiende fn_professor_cancel_session para devolver participantes y datos del curso,
-- evitando queries adicionales en el route handler.

CREATE OR REPLACE FUNCTION public.fn_professor_cancel_session(
  p_professor_id bigint,
  p_session_id   integer,
  p_reason       text DEFAULT ''
)
RETURNS jsonb
LANGUAGE plpgsql AS $$
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 EXISTS (
    SELECT 1 FROM public.professor_profiles
    WHERE partner_id = p_professor_id AND status = 'ACTIVE'
  ) 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::int, 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', email, 'full_name', full_name))
  INTO v_participants
  FROM public.session_participants
  WHERE session_id = p_session_id;

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