using BankYouBankruptBusinessLogic.OfficePackage;
using BankYouBankruptBusinessLogic.OfficePackage.HelperModels;
using BankYouBankruptContracts.BindingModels;
using BankYouBankruptContracts.BusinessLogicsContracts;
using BankYouBankruptContracts.SearchModels;
using BankYouBankruptContracts.StoragesContracts;
using BankYouBankruptContracts.ViewModels;
using BankYouBankruptDataModels.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BankYouBankruptBusinessLogic.BusinessLogics
{
	public class ReportCashierLogic : IReportCashierLogic
	{
		private readonly IMoneyTransferStorage _moneyTransferStorage;

		private readonly ICashWithdrawalStorage _cashWithdrawalStorage;

		private readonly IClientStorage _clientStorage;

		private readonly AbstractSaveToExcel _saveToExcel;

		private readonly AbstractSaveToWordCashier _saveToWord;

		private readonly AbstractSaveToPdf _saveToPdf;

		//инициализируем поля класса через контейнер
		public ReportCashierLogic(IMoneyTransferStorage moneyTransferStorage, ICashWithdrawalStorage cashWithdrawalStorage,
			IClientStorage clientStorage, AbstractSaveToExcel saveToExcel, 
			AbstractSaveToWordCashier saveToWord, AbstractSaveToPdf saveToPdf)
		{
			_moneyTransferStorage = moneyTransferStorage;
			_cashWithdrawalStorage = cashWithdrawalStorage;

			_saveToExcel = saveToExcel;
			_saveToWord = saveToWord;
			_saveToPdf = saveToPdf;
			_clientStorage = clientStorage;
		}

		//формирование списка переводов между счетами за период
		public List<ReportCashierViewModel>? GetMoneyTransfers(ReportBindingModel model)
		{
			return _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo})
				.Select(x => new ReportCashierViewModel
				{
					OperationId = x.Id,
					DateComplite = x.DateOperation,
					AccountPayeeNumber = x.AccountPayeeNumber,
					AccountSenderNumber = x.AccountSenderNumber,
					SumOperation = x.Sum
				})
				.ToList();
		}

		//формирование списка выдаци наличных со счёта за период
		public List<ReportCashierViewModel>? GetCashWithrawals(ReportBindingModel model)
		{
			return _cashWithdrawalStorage.GetFilteredList(new CashWithdrawalSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo })
				.Select(x => new ReportCashierViewModel
				{
					OperationId = x.Id,
					DebitingId = x.DebitingId,
					AccountPayeeNumber = x.AccountNumber,
					DateComplite = x.DateOperation,
					SumOperation = x.Sum
				})
				.ToList();
		}

		//формирование списка выдаци наличных со счёта за период
		public List<ReportCashierViewModel>? GetDebitings(ReportBindingModel model)
		{
			return _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo })
				.Select(x => new ReportCashierViewModel
				{
					OperationId = x.Id,
					DateComplite = x.DateOperation,
					AccountPayeeNumber = x.AccountPayeeNumber,
					AccountSenderNumber = x.AccountSenderNumber,
					SumOperation = x.Sum
				})
				.ToList();
		}

		//формирование полного имени клиента для отчёта
		public string GetFullName(ReportBindingModel model)
		{
			var client = _clientStorage.GetElement(new ClientSearchModel
			{
				Id = model.ClientId
			});

			return client.Surname + " " + client.Name + " " + client.Patronymic;
		}

		//Сохранение мороженных в файл-Word
		public void SaveAccountsToWordFile(ReportBindingModel model)
		{
			throw new NotImplementedException();
		}

		//Сохранение заготовок с указаеним изделий в файл-Excel
		public void SaveAccountsToExcelFile(ReportBindingModel model)
		{
			_saveToExcel.CreateReport(new ExcelInfo
			{
				FileName = model.FileName,

				Title = "Заявки на счёт",

				Debiting = null
			}, ExcelOperationEnum.Для_кассира);
		}

		//Сохранение заказов в файл-Pdf
		public ReportCashierViewModelForHTML SaveAccountsToPdfFile(ReportBindingModel model)
		{
			var listMoneyTransfers = GetMoneyTransfers(model);
			var listCashWithdrawals = GetCashWithrawals(model);

			_saveToPdf.CreateDoc(new PdfInfo
			{
				ForClient = false,
				FileName = model.FileName,
				FullClientName = GetFullName(model),
				Title = "Отчёт по операциям начислений и переводов между счетами",
				DateFrom = model.DateFrom!.Value,
				DateTo = model.DateTo!.Value,
				ReportMoneyTransfer = listMoneyTransfers,
				ReportCashWithdrawal = listCashWithdrawals
			});

			//возврат полученных списков для отображения на вебе
			return new ReportCashierViewModelForHTML
			{
				ReportCashWithdrawal = listCashWithdrawals,

				ReportMoneyTransfer = listMoneyTransfers
			};
		}
	}
}