using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using UniVerse.Application.DTOs.Sync;
using UniVerse.Application.Interfaces;
namespace UniVerse.Api.Controllers;
/// Синхронизация данных из внешней системы расписания Modeus (только Admin).
[ApiController]
[Route("api/v1/sync")]
[Authorize(Roles = "Admin")]
[Produces("application/json")]
public class SyncController : ControllerBase
{
private readonly IScheduleSyncService _sync;
public SyncController(IScheduleSyncService sync) => _sync = sync;
/// Запустить синхронизацию расписания лекций из Modeus.
///
/// Только Admin. Выполняет upsert лекций и связанных курсов на основе данных
/// из внешнего API `schedule.rdcenter.ru`. Поддерживает фильтрацию по специальности,
/// периоду и типу занятий.
///
/// Параметры синхронизации: specialtyCode, timeMin/timeMax, typeId.
/// Результат синхронизации: кол-во созданных, обновлённых и пропущенных записей.
/// Требуется аутентификация.
/// Требуется роль Admin.
[HttpPost("schedule")]
[ProducesResponseType(typeof(SyncResultDto), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
public async Task> SyncSchedule([FromBody] SyncScheduleRequest req) =>
Ok(await _sync.SyncScheduleAsync(req));
/// Получить статус последней синхронизации.
/// Только Admin. Возвращает время и результат последней успешной синхронизации.
/// Статус синхронизации.
/// Требуется аутентификация.
/// Требуется роль Admin.
[HttpGet("status")]
[ProducesResponseType(typeof(SyncStatusDto), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
public async Task> Status() =>
Ok(await _sync.GetLastSyncStatusAsync());
/// Синхронизировать аудитории (локации) из Modeus.
///
/// Только Admin. Импортирует аудитории из `schedule.rdcenter.ru` и создаёт
/// соответствующие записи в таблице locations.
///
/// Результат синхронизации аудиторий.
/// Требуется аутентификация.
/// Требуется роль Admin.
[HttpPost("rooms")]
[ProducesResponseType(typeof(SyncResultDto), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
public async Task> SyncRooms() =>
Ok(await _sync.SyncRoomsAsync());
/// Поиск преподавателей в Modeus по ФИО.
///
/// Только Admin. Ищет преподавателей через внешнее API и возвращает список
/// для ручного импорта. Найденные преподаватели не создаются автоматически.
///
/// Полное имя или часть имени преподавателя для поиска.
/// Список найденных преподавателей.
/// Требуется аутентификация.
/// Требуется роль Admin.
[HttpPost("employees")]
[ProducesResponseType(typeof(List), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
public async Task SearchEmployees([FromQuery] string fullname) =>
Ok(await _sync.SearchEmployeesAsync(fullname));
}