using data.Domain.UseCase;
using data.RemoteData.RemoteDatabase.DAO;
using data.RemoteData.RemoteDataBase.DAO;
using data.Repository;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore.Storage;

namespace presence_api.Controllers;
[ApiController]
[Route("api/[controller]")]
public class PresenceController : ControllerBase { 
    readonly UseCaseGeneratePresence _presenceUseCase;

    public PresenceController(UseCaseGeneratePresence presenceUseCase)
    {
        _presenceUseCase = presenceUseCase;
    }
    [HttpGet]
    public ActionResult<IEnumerable<PresenceDao>> getPresence([FromQuery] int GroupId, [FromQuery] DateOnly StartData, [FromQuery] DateOnly EndData, [FromQuery] int UserId)
    {
        return Ok(_presenceUseCase.GetPresenceAll(EndData,StartData, GroupId, UserId));
    }

    [HttpPost("update")]
    public IActionResult UpdateAttendance([FromBody] List<AttendanceInputModel> attendanceList)
    {
        if (attendanceList == null || !attendanceList.Any())
        {
            return BadRequest("Attendance list cannot be empty.");
        }

        try
        {
            // Вызываем метод сервиса для обновления посещаемости
            _presenceUseCase.UpdateAttendance(attendanceList);

            return Ok("Attendance updated successfully.");
        }
        catch (Exception ex)
        {
            // Логируем ошибку
            return StatusCode(500, $"Internal server error: {ex.Message}");
        }
    }

    [HttpDelete]
    public ActionResult DeletePresence([FromQuery] int GroupId, [FromQuery] int? UserId, [FromQuery] DateOnly? StartDate, [FromQuery] DateOnly? EndDate)
    {
        try
        {
            // Проверка, что хотя бы один параметр задан
            if (!UserId.HasValue && !StartDate.HasValue && !EndDate.HasValue)
            {
                return BadRequest("At least one parameter (UserId, StartDate, EndDate) must be specified.");
            }

            // Выполнение удаления в зависимости от параметров
            if (UserId.HasValue)
            {
                // Удаление посещаемости по UserId
                _presenceUseCase.DeletePresenceByUser(GroupId, UserId.Value);
            }
            else if (StartDate.HasValue && EndDate.HasValue)
            {
                // Удаление посещаемости по диапазону дат
                _presenceUseCase.DeletePresenceByDateRange(GroupId, StartDate.Value, EndDate.Value);
            }
            else
            {
                // Удаление посещаемости по группе (если не задано UserId или диапазон дат)
                _presenceUseCase.DeletePresenceByGroup(GroupId);
            }

            return Ok("Attendance records deleted successfully.");
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Internal server error: {ex.Message}");
        }
    }

    [HttpPost("mark-absent")]
    public IActionResult MarkUserAbsent([FromBody] MarkAbsenceRequest request)
    {
        _presenceUseCase.MarkUserAbsent(request.UserId, request.GroupId, request.Date, request.LessonNumber);
        return Ok("User marked as absent.");
    }
}
