using ApiTerceiroSimulador.Code.Integration;
using ApiTerceiroSimulador.Models;
using ApiTerceiroSimulador.Models.Integration.v1;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
// Para mais informações sobre a documentação, visite https://learn.microsoft.com/pt-br/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-8.0&tabs=visual-studio

namespace ApiTerceiroSimulador.Controllers
{
    [Authorize]
    [Route("api/[controller]")]
    [ApiController]
    [Produces("application/json")]
    public class PollingController : ControllerBase
    {
        private readonly IntegrationService srvIntegracao;

        public PollingController()
        {
            srvIntegracao = new IntegrationService();
        }

        /// <summary>
        /// Método para listar os eventos de integração.
        /// </summary>
        /// <remarks>
        /// Este endpoint será executado para listar os eventos de integração.
        /// <para>
        ///     Deverá ser utilizado no campo <i>"URL de Polling para verificar novos pedidos (GET)"</i>.
        /// </para>
        /// </remarks>
        /// <returns>Lista dos eventos de integração</returns>
        [HttpGet]
        public ListRequestResult<NewEventsResponse> Get()
        {
            ListRequestResult<NewEventsResponse> result;

            string msg;

            try
            {
                IEnumerable<NewEventsResponse> items = srvIntegracao.GetPendingEvents();

                msg = $"Número de eventos retornados: {items.Count()}";

                result = new ListRequestResult<NewEventsResponse>(items);
            }
            catch (Exception ex)
            {
                msg = $"Erro: {ex.Message}";
                result = new ListRequestResult<NewEventsResponse>(500, "Ocorreu um erro ao listar os eventos.");
            }

            Console.WriteLine($"{DateTime.Now} - {msg}");

            return result;
        }
    }
}
