using DocumentFormat.OpenXml.Office2010.Excel;
using Microsoft.AspNetCore.Mvc;
using SushiBarContracts.BindingModels;
using SushiBarContracts.BusinessLogicsContracts;
using SushiBarContracts.SearchModels;
using SushiBarContracts.ViewModels;
using SushiBarDataModels.Enums;

namespace SushiBarRestApi.Controllers;

[Route("api/[controller]/[action]")]
[ApiController]
public class ImplementerController : Controller
{
    private readonly ILogger _logger;
    private readonly IOrderLogic _order;
    private readonly IImplementerLogic _logic;
    public ImplementerController(IOrderLogic order, 
        IImplementerLogic logic, 
        ILogger<ImplementerController> logger)
    {
        _logger = logger;
        _order = order;
        _logic = logic;
    }
    [HttpGet]
    public ImplementerViewModel? Login(string login, string password)
    {
        try
        {
            return _logic.ReadElement(new ImplementerSearchModel
            {
                ImplementerFio = login,
                Password = password
            });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error on auth");
            throw;
        }
    }
    [HttpGet]
    public List<OrderViewModel>? GetNewOrders()
    {
        try
        {
            return _order.ReadList(new OrderSearchModel
            {
                Status = OrderStatus.Accepted
            });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error on get new orders");
            throw;
        }
    }
    [HttpGet]
    public OrderViewModel? GetImplementerOrder(int implementerId)
    {
        try
        {
            return _order.ReadElement(new OrderSearchModel
            {
                ImplementerId = implementerId
            });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error on get current order");
            throw;
        }
    }
    [HttpPost]
    public void TakeOrderInWork(OrderBindingModel model)
    {
        try
        {
            _order.TakeOrderInWork(model);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error on take in work order with id {Id}", model.Id);
            throw;
        }
    }
    [HttpPost]
    public void FinishOrder(OrderBindingModel model)
    {
        try
        {
            _order.FinishOrder(model);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error on ready order with id {Id}", model.Id);
            throw;
        }
    }

}