using BusinessLogic.BusinessLogic;
using Contracts.BindingModels;
using Contracts.BusinessLogicContracts;
using Contracts.Exceptions;
using Contracts.SearchModels;
using Contracts.ViewModels;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;

namespace RestAPI.Controllers
{
	[Route("[controller]/[action]")]
	[ApiController]
	public class RoleController
	{
		private readonly ILogger _logger;
		private readonly IRoleLogic _roleLogic;

		public RoleController(ILogger<RoleController> logger, IRoleLogic roleLogic)
		{
			_logger = logger;
			_roleLogic = roleLogic;
		}

		[HttpGet]
		public IResult Get([FromQuery] RoleSearchModel model)
		{
			try
			{
				var res = _roleLogic.ReadElement(model);
				return Results.Ok(res);
			}
			catch (ElementNotFoundException ex)
			{
				_logger.LogInformation(ex, "Role not found");
				return Results.NoContent();
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Error get role");
				return Results.Problem(ex.Message);
			}
		}

		[HttpGet]
		public IResult GeFilteredtList([FromQuery] RoleSearchModel model)
		{
			try
			{
				var res = _roleLogic.ReadElements(model).ToList();
				return Results.Ok(res);
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Error get list role");
				return Results.Problem(ex.Message);
			}
		}

		[HttpGet]
		public IResult GetList()
		{
			try
			{
				var res = _roleLogic.ReadElements(null).ToList();
				return Results.Ok(res);
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Error get list role");
				return Results.Problem(ex.Message);
			}
		}

		[HttpPost]
		public IResult Create([FromBody] RoleBindingModel model)
		{
			try
			{
				var res = _roleLogic.Create(model);
				return Results.Created(string.Empty, res);
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Error create role");
				return Results.Problem(ex.Message);
			}
		}

		[HttpPatch]
		public IResult Update([FromBody] RoleBindingModel model)
		{
			try
			{
				var res = _roleLogic.Update(model);
				return Results.Ok(res);
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Error update role");
				return Results.Problem(ex.Message);
			}
		}

		[HttpDelete]
		public IResult Delete([FromQuery] RoleSearchModel model)
		{
			try
			{
				var res = _roleLogic.Delete(model); ;
				return Results.Ok(res);
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Error delete role");
				return Results.Problem(ex.Message);
			}
		}
	}
}