using BankYouBankruptContracts.BindingModels;
using BankYouBankruptContracts.BusinessLogicsContracts;
using BankYouBankruptContracts.SearchModels;
using BankYouBankruptContracts.ViewModels;
using BankYouBankruptDatabaseImplement.Models;
using BankYouBankruptDataModels.Enums;
using Microsoft.AspNetCore.Mvc;

namespace BankYouBankruptRestApi.Controllers
{
    //указание у контроллера, что Route будет строиться не только по наванию контроллера, но и по названию метода (так как у нас два Post-метода)
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class AccountController : Controller
    {
        private readonly ILogger _logger;

        private readonly IAccountLogic _accountLogic;

		private readonly IDebitingLogic _debitingLogic;

		private readonly ICashWithdrawalLogic _cashLogic;

		public AccountController(IAccountLogic accountLogic, IDebitingLogic debitingLogic, ICashWithdrawalLogic cashLogic, ILogger<AccountController> logger)
        {
            _logger = logger;
            _accountLogic = accountLogic;
            _debitingLogic = debitingLogic;
			_cashLogic = cashLogic;
        }

        [HttpGet]
        public AccountViewModel? Login(string accountNumber, string passwordAccount)
        {
            try
            {
                //попытка найти запись по переданным номеру и паролю счёта
                return _accountLogic.ReadElement(new AccountSearchModel
                {
                    AccountNumber = accountNumber,
                    PasswordAccount = passwordAccount
                });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка входа в систему");
                throw;
            }
        }

        [HttpPost]
        public void Register(AccountBindingModel model)
        {
            try
            {
                //создание счёта
                _accountLogic.Create(model);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка регистрации");
                throw;
            }
        }

        [HttpPost]
        public void UpdateData(AccountBindingModel model)
        {
            try
            {
                //изменение счёта
                _accountLogic.Update(model);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка обновления данных");
                throw;
            }
        }

        //найти все счета, которые создал конкретный кассир
		[HttpGet]
		public List<AccountViewModel>? SearchAccounts(int cashierId)
		{
			try
			{
				return _accountLogic.ReadList(new AccountSearchModel
				{
					CashierId = cashierId
				});
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Ошибка входа в систему");
				throw;
			}
		}

        //найти все счета клиента
		[HttpGet]
		public List<AccountViewModel>? SearchAccountsOfCLient(int clientId)
		{
			try
			{
				//попытка найти запись по переданным номеру и паролю счёта
				return _accountLogic.ReadList(new AccountSearchModel
				{
					ClientId = clientId
				});
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Ошибка входа в систему");
				throw;
			}
		}

		//найти все открытые заявки на снятие средств
		[HttpGet]
		public List<DebitingViewModel>? FindOpenDebiting()
		{
			try
			{
				return _debitingLogic.ReadList(new DebitingSearchModel
				{
					Status = StatusEnum.Открыта
				});
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Ошибка входа в систему");
				throw;
			}
		}

		//подтверждение заявки на снятие средств со счёта
		[HttpPost]
		public void CloseApplication(CashWithdrawalBindingModel CashWithdrawal)
		{
			try
			{
				_cashLogic.Create(CashWithdrawal);
			}
			catch (Exception ex)
			{
				_logger.LogError(ex, "Ошибка входа в систему");
				throw;
			}
		}
	}
}