using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SewingDressesContracts.BindingModels;
using SewingDressesContracts.BusinessLogicsContracts;
using SewingDressesContracts.SearchModels;
using SewingDressesContracts.ViewModels;
using SewingDressesDataModels.Enums;

namespace SewingDressesRestApi.Controllers
{
	[Route("api/[controller]/[action]")]
	[ApiController]
	public class ImplementController : Controller
	{
		private readonly ILogger _logger;

		private readonly IOrderLogic _order;

		private readonly IImplementLogic _logic;

		public ImplementController(IOrderLogic order, IImplementLogic logic, ILogger<ImplementController> logger)
		{
			_logger = logger;
			_order = order;
			_logic = logic;
		}

		[HttpGet]
		public ImplementViewModel? Login(string login, string password)
		{
			try
			{
				return _logic.ReadElement(new ImplementSearchModel
				{
					ImplementFIO = login,
					Password = password
				});
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Ошибка авторизации сотрудника");
				throw;
			}
		}

		[HttpGet]
		public List<OrderViewModel>? GetNewOrders()
		{
			try
			{
				return _order.ReadList(new OrderSearchModel
				{
					Status = OrderStatus.Принят
				});
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Ошибка получения новых заказов");
				throw;
			}
		}

		[HttpGet]
		public OrderViewModel? GetImplementOrder(int ImplementId)
		{
			try
			{
				return _order.ReadElement(new OrderSearchModel
				{
					ImplementId = ImplementId
				});
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Ошибка получения текущего заказа исполнителя");
				throw;
			}
		}

		[HttpPost]
		public void TakeOrderInWork(OrderBindingModel model)
		{
			try
			{
				_order.TakeOrderInWork(model);
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Ошибка перевода заказа с №{Id} в работу", model.Id);
				throw;
			}
		}

		[HttpPost]
		public void FinishOrder(OrderBindingModel model)
		{
			try
			{
				_order.FinishOrder(model);
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Ошибка отметки о готовности заказа с №{Id}", model.Id);
				throw;
			}
		}
	}
}
