using BankYouBankruptBusinessLogic.BusinessLogics;
using BankYouBankruptContracts.BindingModels;
using BankYouBankruptContracts.BusinessLogicsContracts;
using BankYouBankruptContracts.SearchModels;
using BankYouBankruptContracts.ViewModels.Client.Default;
using BankYouBankruptContracts.ViewModels.Client.Diagram;
using Microsoft.AspNetCore.Mvc;
using System.Linq.Expressions;
using System.Net;

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

        private readonly ICardLogic _cardLogic;

        private readonly IDebitingLogic _debitingLogic;

        private readonly ICreditingLogic _creditingLogic;

        private readonly IAccountLogic _accountLogic;

        public CardController(ICardLogic cardLogic, IDebitingLogic debitingLogic, ICreditingLogic creditingLogic, IAccountLogic accountLogic, ILogger<ClientController> logger)
        {
            _logger = logger;
            _cardLogic = cardLogic;
            _debitingLogic = debitingLogic;
            _creditingLogic = creditingLogic;
            _accountLogic = accountLogic;
        }

        [HttpGet]
        public List<CardViewModel>? GetAllCards()
        {
            try
            {
                return _cardLogic.ReadList(null);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка получения карт");
                throw;
            }

        }


        [HttpGet]
        public List<CardViewModel>? GetUsersCardsList(int id)
        {
            try
            {
                return _cardLogic.ReadList(new CardSearchModel { ClientID = id });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка получения карт");
                throw;
            }

        }

        [HttpPost]
        public void CreateCard(CardBindingModel model) {
            try
            {
                _cardLogic.Create(model);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка создания карты");
                Response.StatusCode = (int)HttpStatusCode.NotAcceptable;
            }
        }

        [HttpPost]
        public void CreateDebitingRequest(DebitingBindingModel model) {
            try
            {
                _debitingLogic.Create(model);
			}
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка создания запроса на снятие наличных");
                Response.StatusCode = (int)HttpStatusCode.NotAcceptable;
            }
        }

        [HttpPost]
        public void CreateCreditingOperation(CreditingBindingModel model) {
            try {
                _creditingLogic.Create(model);
            }
            catch (Exception ex) {
                _logger.LogError(ex, "Ошибка создания операции на пополнение");
                Response.StatusCode = (int)HttpStatusCode.NotAcceptable;
            }
        }

		[HttpGet]
		public CardViewModel? FindCard(int id)
		{
			try
			{
				return _cardLogic.ReadElement(new CardSearchModel
				{
					Id = id
				});
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Ошибка входа в систему");
				throw;
			}
		}

        [HttpGet]
        public List<ClientDiagramElementsViewModel> getCardMonthResult(int cardId)
        {
            try
            {
                return _cardLogic.GetMonthInfo(cardId);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка получения пользователей");
                throw;
            }
        }
    }
}