using ApiTerceiroSimulador.Code.Integration;
using ApiTerceiroSimulador.Models;
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 TestOrderController : Controller
    {
        private readonly IntegrationService srvIntegracao;

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

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

            try
            {
                IEnumerable<string> ids = srvIntegracao.ListOrderIDs();
                result = new ListRequestResult<string>(ids);
            }
            catch (Exception ex)
            {
                msg = $"erro: {ex.Message}";
                result = new ListRequestResult<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 pedido.
        /// </summary>
        /// <remarks>
        /// Este endpoint de teste é usado para criar um novo pedido. 
        /// <para>
        ///     <b>É usado para criar um novo pedido com seu evento de envio associado.</b>
        /// </para>
        /// </remarks>
        /// <param name="options">Opções para a criação do pedido</param>
        /// <returns>Resultado da operação</returns>
        [HttpPost]
        public IActionResult Post([FromBody] CreateOrderOptions options)
        {
            IActionResult result;

            try
            {
                //IntegrationService.AutoGenerateOrders = false;

                IntegrationItem item = srvIntegracao.CreateOrder(options);
                result = Ok(item);
            }
            catch (Exception ex)
            {
                result = BadRequest(ex);
            }

            return result;
        }
    }
}
