"""Clear time, location, and session from selected exam activities."""

from django.db import transaction

from api.services.exam_scheduler.catalog import (
	_build_requirement_snapshots,
	_load_selected_activities,
)
from api.services.exam_scheduler.common import (
	_apply_activity_changes,
	_build_response_payload,
	_normalize_ids,
)


@transaction.atomic
def unschedule_exam_requirements(activity_ids, user_id):
	activity_ids = _normalize_ids(activity_ids)
	if not activity_ids:
		return {
			"data": {"activities": []},
			"old_data": {},
			"new_data": {},
			"remark_codes": [],
		}

	selected_activities = _load_selected_activities(activity_ids)
	requirement_ids = list(dict.fromkeys(activity.exam_requirement_id for activity in selected_activities))
	requirement_student_map = _build_requirement_snapshots(requirement_ids)

	changed_activities = []
	old_data = {}
	new_data = {}
	remark_codes = []

	for activity in selected_activities:
		old_value = {
			"time_slot": activity.time_slot,
			"location_id": activity.location_id,
			"session_id": activity.session_id,
			"is_scheduled": activity.is_scheduled,
		}
		new_value = {
			"time_slot": None,
			"location_id": None,
			"session_id": None,
			"is_scheduled": False,
		}
		if old_value != new_value:
			old_data.setdefault(activity.id, old_value)
			new_data.setdefault(activity.id, new_value)
			activity.time_slot = None
			activity.location = None
			activity.session = None
			activity.is_scheduled = False
			changed_activities.append(activity)
			remark_codes.append(activity.code)

	_apply_activity_changes(changed_activities, user_id)

	payload_activities = _load_selected_activities(activity_ids)
	return {
		"data": _build_response_payload(payload_activities, requirement_student_map),
		"old_data": old_data,
		"new_data": new_data,
		"remark_codes": list(dict.fromkeys(remark_codes)),
	}
