using ApiTerceiroSimulador.Code;
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 OrderController : ControllerBase
    {
        private readonly IntegrationService srvIntegracao;

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

        // GET api/<IntegracaoController>/5

        /// <summary>
        /// Método para pesquisar os detalhes do pedido
        /// </summary>
        /// <remarks>
        /// Este endpoint será executado para retornar os detalhes do pedido.
        /// <para>
        ///     Deverá ser utilizado no campo <i>"URL para obter os detalhes do pedido (GET)"</i>.
        /// </para>
        /// </remarks>
        /// <param name="orderId">Identificador de origem do pedido (ID do parceiro)</param>
        /// <returns>Detalhes do pedido</returns>
        [HttpGet("{orderId}")]
        public SingleRequestResult<OrderDetailsResponse> Get(string orderId)
        {
            SingleRequestResult<OrderDetailsResponse> result;

            string msg;

            try
            {
                OrderDetailsResponse? order = srvIntegracao.GetOrderDetails(orderId);

                if (order != null)
                {
                    srvIntegracao.RemoveEventByType(orderId, "PLACED");

                    msg = $"{orderId} localizado!";
                    result = new SingleRequestResult<OrderDetailsResponse>(order);
                }
                else
                {
                    msg = $"{orderId} NÃO localizado!";
                    result = new SingleRequestResult<OrderDetailsResponse>(404, msg);
                }
            }
            catch (Exception ex)
            {
                msg = $"{orderId} erro: {ex.Message}";
                result = new SingleRequestResult<OrderDetailsResponse>(500, "Ocorreu um erro ao selecionar o pedido.");
            }

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

            return result;
        }

        // POST api/<IntegracaoController>
        /// <summary>
        /// Método para alterar o status do pedido
        /// </summary>
        /// <remarks>
        /// Este endpoint altera o status do pedido.
        /// <para>
        ///     Deverá ser utilizado no campo <i>"URL para enviar o status do pedido (POST)"</i>.
        /// </para>
        /// </remarks>
        /// <param name="change">Modelo contendo as informações para alteração do status do pedido</param>
        /// <returns>Resultado da operação</returns>
        [HttpPost]
        public RequestResult Post([FromBody] ChangeStatusModel change)
        {
            RequestResult result;

            string msg;
            bool ignorenotfoundorder = false;
            ignorenotfoundorder = true; // Para permitir limpar a fila de pedidos

            try
            {
                bool resp = srvIntegracao.ConfirmOrder(change.OrderId, change.Status, change.Justification);
                if (resp || ignorenotfoundorder)
                {
                    msg = $"{change.OrderId} alterado para '{change.Status}': {change.Justification ?? "(N/D)"}.";
                    result = new RequestResult(0, msg);
                }
                else
                {
                    msg = $"{change.OrderId} NÃO alterado";
                    result = new RequestResult(5, msg);
                }
            }
            catch (Exception ex)
            {
                msg = $"{change.OrderId} erro: {ex.Message}";
                result = new RequestResult(500, "Ocorreu um erro ao alterar status do pedido.");
            }

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

            return result;
        }
    }
}
