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

namespace ApiTerceiroSimulador.Controllers
{
    /// <summary>
    /// Classe utilizada para a criação manual de pedidos para teste
    /// </summary>
    [Authorize]
    [Route("api/[controller]")]
    [ApiController]
    [Produces("application/json")]
    public class TestEventController : Controller
    {
        private readonly IntegrationService srvIntegracao;

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

        /// <summary>
        /// Método de teste para listar o identificador dos eventos.
        /// </summary>
        /// <remarks>
        /// Este endpoint de teste é usado para listar os identificadores dos eventos.
        /// </remarks>
        //// <returns>Listagem dos identificadores dos eventos</returns>
        [HttpGet]
        public ListRequestResult<KeyValuePair<string, string>> GetList()
        {
            ListRequestResult<KeyValuePair<string, string>> result;
            string msg = "";

            try
            {
                Dictionary<string, string> ids = srvIntegracao.ListEventDs();
                result = new ListRequestResult<KeyValuePair<string, string>>(ids);
            }
            catch (Exception ex)
            {
                msg = $"erro: {ex.Message}";
                result = new ListRequestResult<KeyValuePair<string, string>>(500, "Ocorreu um erro ao selecionar o pedido.");
            }

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

            return result;
        }

        /// <summary>
        /// Método de teste para criar um novo evento.
        /// </summary>
        /// <remarks>
        /// Este endpoint de teste é usado para criar um novo evento.
        /// <para>
        ///     <b>É usado apenas em situações muito específicas para integração.</b>
        /// </para>
        /// </remarks>
        /// <param name="settings">Configurações do evento a ser criado</param>
        /// <returns>Resultado da operação</returns>
        [HttpPost]
        public IActionResult Post([FromBody] EventCreationSettings settings)
        {
            IActionResult result;

            try
            {
                NewEventsResponse item = srvIntegracao.CreateEvent(settings);
                result = Ok(item);
            }
            catch (Exception ex)
            {
                result = BadRequest(ex);
            }

            return result;
        }
    }
}
