using BankYouBankruptContracts.BindingModels;
using BankYouBankruptContracts.BusinessLogicsContracts;
using BankYouBankruptContracts.SearchModels;
using BankYouBankruptContracts.ViewModels;
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>? 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;
            }
        }
    }
}