using Microsoft.AspNetCore.Mvc;
using VetClinicAdminApp.Models;
using System.Diagnostics;
using VetClinicContracts.BindingModels;
using VetClinicContracts.ViewModels;
using VetClinicDataModels.Models;
using System.Text;
using System.Globalization;
using VetClinicContracts.SearchModels;
using System.IO.Pipelines;
using VetClinicContracts.BusinessLogicsContracts;
using VetClinicDataBaseImplement.Implements;
using VetClinicDataBaseImplement.Models;


namespace VetClinicAdminApp.Controllers
{
	public class HomeController : Controller
	{
		private readonly ILogger<HomeController> _logger;

		public HomeController(ILogger<HomeController> logger)
		{
			_logger = logger;
		}
		[HttpGet]
		public IActionResult ServiceListReport()
		{
			ViewBag.Animals = APIAdmin.GetRequest<List<AnimalViewModel>>($"api/animal/getanimallist?adminid={APIAdmin.Admin.Id}");
			return View();
		}
		[HttpGet]
		public IActionResult Report()
		{
            ViewBag.Report = new List<MedicinesVaccinationsBindingModel>();
            return View();
		}
		public IActionResult Index()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			return
View(APIAdmin.GetRequest<List<VisitViewModel>>($"api/visit/getvisits?adminId={APIAdmin.Admin.Id}"));

		}
		public IActionResult IndexAnimals()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			return
View(APIAdmin.GetRequest<List<AnimalViewModel>>($"api/animal/getanimallist?adminId={APIAdmin.Admin.Id}"));

		}
		public IActionResult IndexVaccinations()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			return
View(APIAdmin.GetRequest<List<VaccinationViewModel>>($"api/vaccination/getvaccinations?adminId={APIAdmin.Admin.Id}"));

		}

		[HttpGet]
		public IActionResult Privacy()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			return View(APIAdmin.Admin);
		}

		[HttpPost]
		public void Privacy(string login, string password, string fio)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как суда попали? Суда вход только авторизованным");
			}
			if (string.IsNullOrEmpty(login) ||
			string.IsNullOrEmpty(password) || string.IsNullOrEmpty(fio))
			{
				throw new Exception("Введите email, пароль и ФИО");
			}
			APIAdmin.PostRequest("api/admin/updatedata", new
			AdminBindingModel
			{
				Id = APIAdmin.Admin.Id,
				AdminFIO = fio,
				Email = login,
				Password = password
			});
			APIAdmin.Admin.AdminFIO = fio;
			APIAdmin.Admin.Email = login;
			APIAdmin.Admin.Password = password;
			Response.Redirect("Index");
		}

		[HttpGet]
		public IActionResult Enter()
		{
			return View();
		}
		[HttpPost]
		public void Enter(string login, string password)
		{
			if (string.IsNullOrEmpty(login) ||
			string.IsNullOrEmpty(password))
			{
				throw new Exception("Введите email и пароль");
			}
			APIAdmin.Admin =
			APIAdmin.GetRequest<AdminViewModel>($"api/admin/login?login={login}&password={password}");
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Неверный логин/пароль");
			}
			Response.Redirect("Index");
		}
		[HttpGet]
		public IActionResult Register()
		{
			return View();
		}
		[HttpPost]
		public void Register(string login, string password, string fio)
		{
			if (string.IsNullOrEmpty(login) ||
			string.IsNullOrEmpty(password) || string.IsNullOrEmpty(fio))
			{
				throw new Exception("Введите логин, пароль и ФИО");
			}
			APIAdmin.PostRequest("api/admin/register", new
			AdminBindingModel
			{
				AdminFIO = fio,
				Email = login,
				Password = password
			});
			Response.Redirect("Enter");
			return;
		}

		public IActionResult Create()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			ViewBag.Services = APIAdmin.GetRequest<List<ServiceViewModel>>($"api/service/getservices");
			return View();
		}
		public IActionResult CreateAnimal()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			return View();
		}
		public IActionResult CreateVaccination()
		{
			ViewBag.Animals = APIAdmin.GetRequest<List<AnimalViewModel>>($"api/animal/getanimallist?adminid={APIAdmin.Admin.Id}");
			return View();
		}

		[HttpPost]
		public void Create(string name, DateTime date, List<int> services)
		{
			if (APIAdmin.Admin == null)
			{
			throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			if (string.IsNullOrEmpty(name))
			{
				throw new Exception("Ошибка в введенных данных");
			}
			Dictionary<int, IServiceModel> a = new Dictionary<int, IServiceModel>();
			foreach (int service in services)
			{
				a.Add(service, new ServiceSearchModel { Id = service } as IServiceModel);
			}
			APIAdmin.PostRequest("api/visit/createvisit", new VisitBindingModel
			{
				NameVisit = name,
				DateVisit = date,
				AdminId = APIAdmin.Admin.Id,
				ServiceVisits = a
			});
			Response.Redirect("Index");
		}
		[HttpPost]
		public void CreateAnimal(string animalname,string family)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			if (string.IsNullOrEmpty(animalname))
			{
				throw new Exception("Ошибка в введенных данных");
			}
			APIAdmin.PostRequest("api/animal/createanimal", new AnimalBindingModel
			{
				AnimalName = animalname,
				Family = family,
				AdminId = APIAdmin.Admin.Id
			});
			Response.Redirect("IndexAnimals");
		}
		[HttpPost]
		public void CreateVaccination(int animal, string name, string cost,DateTime date)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			if (string.IsNullOrEmpty(name))
			{
				throw new Exception("Ошибка в введенных данных");
			}
			StringBuilder st = new StringBuilder(cost);
			for (int i = 0; i < cost.Length; i++)
			{
				if (cost[i] == '.')
					st[i] = ',';
			}
			cost = st.ToString();
			double _cost;
			try
			{
				_cost = Convert.ToDouble(cost);
			}
			catch (Exception ex)
			{
				throw new Exception("Ошибка в введенных данных");
			}
			if (_cost <= 0)
			{
				throw new Exception("Цена должна быть выше 0");
			}
			if (date == null)
			{
				throw new Exception("Выберите дату");
			}
			APIAdmin.PostRequest("api/vaccination/createvaccination", new VaccinationBindingModel
			{
				AnimalId = animal,
				NameVaccination = name,
				CostVaccination = Math.Round(_cost, 2),
				DateStamp = date
			});
			Response.Redirect("IndexVaccinations");
		}
	
		public IActionResult Delete()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			ViewBag.Visits = APIAdmin.GetRequest<List<VisitViewModel>>("api/visit/getvisits");
			return View();
		}

		[HttpPost]
		public void Delete(int visit)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			APIAdmin.PostRequest("api/visit/deletevisit", new VisitBindingModel
			{
				Id = visit
			});
			Response.Redirect("Index");
		}

		public IActionResult DeleteAnimal()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			ViewBag.Animals = APIAdmin.GetRequest<List<AnimalViewModel>>($"api/animal/getanimallist?adminid={APIAdmin.Admin.Id}");
			return View();
		}
		public IActionResult DeleteVaccination()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			ViewBag.Vaccinations = APIAdmin.GetRequest<List<VaccinationViewModel>>($"api/vaccination/getvaccinations?adminid={APIAdmin.Admin.Id}");
			return View();
		}

		[HttpPost]
		public void DeleteAnimal(int animal)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			APIAdmin.PostRequest("api/animal/deleteanimal", new AnimalBindingModel
			{
				Id = animal
			});
			Response.Redirect("IndexAnimals");
		}
		[HttpPost]
		public void DeleteVaccination(int vaccination)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			APIAdmin.PostRequest("api/vaccination/deletevaccination", new VaccinationBindingModel
			{
				Id = vaccination
			});
			Response.Redirect("IndexVaccinations");
		}

		public IActionResult Update()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			ViewBag.Visits = APIAdmin.GetRequest<List<VisitViewModel>>($"api/visit/getvisits?adminid={APIAdmin.Admin.Id}");
			ViewBag.Services = APIAdmin.GetRequest<List<ServiceViewModel>>($"api/service/getservices");
			return View();
		}

		[HttpPost]
		public void Update(int visit, string name, DateTime date, List<int> services)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			if (string.IsNullOrEmpty(name))
			{
				throw new Exception("Ошибка в введенных данных");
			}
			Dictionary<int, IServiceModel> a = new Dictionary<int, IServiceModel>();
			foreach (int service in services)
			{
				a.Add(service, new ServiceSearchModel { Id = service } as IServiceModel);
			}
			APIAdmin.PostRequest("api/visit/updatevisit", new VisitBindingModel
			{
				Id = visit,
				NameVisit = name,
				AdminId = APIAdmin.Admin.Id,
				DateVisit = date,
				ServiceVisits = a
			});
			Response.Redirect("Index");
		}
		public IActionResult UpdateAnimal()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			ViewBag.Animals = APIAdmin.GetRequest<List<AnimalViewModel>>($"api/animal/getanimallist?adminid={APIAdmin.Admin.Id}");

			return View();
		}

		[HttpPost]
		public void UpdateAnimal(int animal, string name, string family)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}

			if (string.IsNullOrEmpty(name))
			{
				throw new Exception("Ошибка в введенных данных");
			}
			APIAdmin.PostRequest("api/animal/updateanimal", new AnimalBindingModel
			{
				Id = animal,
				AnimalName = name,
				Family = family

			});
			Response.Redirect("IndexAnimals");
		}
		public IActionResult VisitAnimals()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter"); 
			}
			ViewBag.Animals = APIAdmin.GetRequest<List<AnimalViewModel>>($"api/animal/getanimallist?adminid={APIAdmin.Admin.Id}");
			ViewBag.Visits = APIAdmin.GetRequest<List<VisitViewModel>>($"api/visit/getvisits");
			return View();
		}
		[HttpPost]
		public void VisitAnimals(int animal, string name, string family,
			List<int> visits)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}

			if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(family))
			{
				throw new Exception("Ошибка в введенных данных");
			}
			Dictionary<int, IVisitModel> v = new Dictionary<int, IVisitModel>();
			foreach (int visit in visits)
			{
				v.Add(visit, new VisitSearchModel { Id = visit } as IVisitModel);
			}
			APIAdmin.PostRequest("api/animal/updateanimal?isconnection=true", new AnimalBindingModel
			{
				Id = animal,
				AnimalName = name,
				Family = family,
				AdminId = APIAdmin.Admin.Id,
				VisitAnimals = v
			});
			Response.Redirect("IndexAnimals");
		}
		public IActionResult ServiceVisits()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			ViewBag.Visits = APIAdmin.GetRequest<List<VisitViewModel>>($"api/visit/getvisits?adminid={APIAdmin.Admin.Id}");
			ViewBag.Services = APIAdmin.GetRequest<List<ServiceViewModel>>($"api/service/getservices");
			return View();
		}
		[HttpPost]
		public void ServiceVisits(int visit, string name, DateTime date,
			List<int> services)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}

			if (string.IsNullOrEmpty(name) || date == new DateTime())
			{
				throw new Exception("Ошибка в введенных данных");
			}
			Dictionary<int, IServiceModel> s = new Dictionary<int, IServiceModel>();
			foreach (int service in services)
			{
				s.Add(service, new ServiceSearchModel { Id = service } as IServiceModel);
			}
			APIAdmin.PostRequest("api/visit/updatevisit?isconnection=true", new VisitBindingModel
			{
				Id = visit,
				NameVisit = name,
				DateVisit = date,
				AdminId = APIAdmin.Admin.Id,
				ServiceVisits = s
			});
			Response.Redirect("Index");
		}
		public IActionResult Vaccinations()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			var res = APIAdmin.GetRequest<List<VaccinationViewModel>>($"api/vaccination/getvaccinations?pharmacistid={APIAdmin.Admin.Id}");
			return
View(res);

		}
		public IActionResult UpdateVaccination()
		{
			if (APIAdmin.Admin == null)
			{
				return Redirect("~/Home/Enter");
			}
			ViewBag.Vaccinations = APIAdmin.GetRequest<List<VaccinationViewModel>>($"api/vaccination/getvaccinations?adminid={APIAdmin.Admin.Id}");
			ViewBag.Animals = APIAdmin.GetRequest<List<AnimalViewModel>>($"api/animal/getanimallist?adminid={APIAdmin.Admin.Id}");
			return View();
		}

		[HttpPost]
		public void UpdateVaccination(int vaccination,int animal, string name, string cost, DateTime date)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			StringBuilder st = new StringBuilder(cost);
			for (int i = 0; i < cost.Length; i++)
			{
				if (cost[i] == '.')
					st[i] = ',';
			}
			cost = st.ToString();
			double _cost;
			try
			{
				_cost = Convert.ToDouble(cost);
			}
			catch (Exception ex)
			{
				throw new Exception("Îøèáêà â ââåäåííûõ äàííûõ");
			}
			if (string.IsNullOrEmpty(name) || _cost <= 0)
			{
				throw new Exception("Ошибка в введенных данных");
			}
			APIAdmin.PostRequest("api/vaccination/updatevaccination", new VaccinationBindingModel
			{
				Id = vaccination,
				AnimalId = animal,
				NameVaccination = name,
				CostVaccination = Math.Round(_cost, 2),
				DateStamp = date

			});
			Response.Redirect("IndexVaccinations");
		}
		[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
		public IActionResult Error()
		{
			return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
		}

		[HttpGet]
		public Tuple<VisitViewModel, List<Tuple<string, int>>>? GetVisit(int visitId)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			var result = APIAdmin.GetRequest<Tuple<VisitViewModel, List<Tuple<string, int>>>>($"api/visit/getvisit?visitid={visitId}");
			if (result == null)
			{
				return default;
			}

			return result;
		}
		[HttpGet]
		public Tuple<AnimalViewModel, List<Tuple<string, int>>>? GetAnimal(int animalId)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			var result = APIAdmin.GetRequest<Tuple<AnimalViewModel, List<Tuple<string, int>>>>($"api/animal/getanimal?animalid={animalId}");
			if (result == null)
			{
				return default;
			}

			return result;
		}
		[HttpGet]
		public Tuple<ServiceViewModel, List<string>>? GetService(int serviceId)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			var result = APIAdmin.GetRequest<Tuple<ServiceViewModel, List<string>>>($"api/service/getservice?serviceid={serviceId}");
			if (result == null)
			{
				return default;
			}

			return result;
		}
		[HttpGet]
		public VaccinationViewModel GetVaccination(int vaccinationId)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Âû êàê ñþäà ïîïàëè? Ñþäà âõîä òîëüêî àâòîðèçîâàííûì");
			}
			var result = APIAdmin.GetRequest<VaccinationViewModel>($"api/vaccination/getvaccination?vaccinationid={vaccinationId}");
			if (result == null)
			{
				return default;
			}

			return result;
		}

        [HttpPost]
		public void ServiceListReport(List<int> animals, string type)
		{
			if (APIAdmin.Admin == null)
			{
				throw new Exception("Вы как суда попали? Суда вход только авторизованным");
			}

			if (animals.Count <= 0)
			{
				throw new Exception("Количество должно быть больше 0");
			}

			if (string.IsNullOrEmpty(type))
			{
				throw new Exception("Неверный тип отчета");
			}



			if (type == "docx")
			{
				APIAdmin.PostRequest("api/reportadmin/createservicelistwordfile", new ListServicesBindingModel
				{
					Animals = animals,
					FileName = "C:\\ReportsCourseWork\\wordfile.docx"
				});
				Response.Redirect("GetWordFile");
			}
			else
			{
				APIAdmin.PostRequest("api/reportadmin/createservicelistexcelfile", new ListServicesBindingModel
				{
                    Animals = animals,
					FileName = "C:\\ReportsCourseWork\\excelfile.xlsx"
				});
				Response.Redirect("GetExcelFile");
			}
		}

		[HttpGet]
		public IActionResult GetWordFile()
		{
			return new PhysicalFileResult("C:\\ReportsCourseWork\\wordfile.docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
		}

		public IActionResult GetExcelFile()
		{
			return new PhysicalFileResult("C:\\ReportsCourseWork\\excelfile.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
		}
        [HttpGet]
        public string GetServicesReport(DateTime dateFrom, DateTime dateTo)
        {
            if (APIAdmin.Admin == null)
            {
                throw new Exception("Вы как суда попали? Суда вход только авторизованным");
            }
            List<MedicinesVaccinationsViewModel> result;
            try
            {
                string dateFromS = dateFrom.ToString("s", CultureInfo.InvariantCulture);
                string dateToS = dateTo.ToString("s", CultureInfo.InvariantCulture);
                result = APIAdmin.GetRequest<List<MedicinesVaccinationsViewModel>>
                  ($"api/reportadmin/getmedicinesvaccinationsreport?datefrom={dateFromS}&dateto={dateToS}&adminid={APIAdmin.Admin.Id}")!;

            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка создания отчета");
                throw;
            }
            string table = "";
            table += "<h2 class=\"text-custom-color-1\">Предварительный отчет</h2>";
            table += "<div class=\"table-responsive\">";
            table += "<table class=\"table table-striped table-bordered table-hover\">";
            table += "<thead class=\"table-dark\">";
            table += "<tr>";
            table += "<th scope=\"col\">Дата</th>";
            table += "<th scope=\"col\">Название визита</th>";
            table += "<th scope=\"col\">Животное прививки</th>";
            table += "<th scope=\"col\">Название медикамента</th>";
            table += "</tr>";
            table += "</thead>";
            foreach (var visit in result)
            {
                table += "<tbody>"; // Открываем блок данных для каждого визита

                // Строка для визита
                table += "<tr>";
                table += $"<td>{visit.DateVisit}</td>";
                table += $"<td>{visit.VisitName}</td>";
                table += $"<td></td>";
                table += $"<td></td>";
                table += "</tr>";

                // Строки для вакцинаций
                foreach (var vaccination in visit.Vaccinations)
                {
                    table += "<tr>";
                    table += $"<td>{vaccination.DateStamp}</td>";
                    table += $"<td></td>";
                    table += $"<td>{vaccination.AnimalName}</td>";
                    table += $"<td></td>";
                    table += "</tr>";
                }

                // Строки для медикаментов
                foreach (var medicine in visit.Medicines)
                {
                    table += "<tr>";
                    table += $"<td></td>";
                    table += $"<td></td>";
                    table += $"<td></td>";
                    table += $"<td>{medicine.MedicineName}</td>";
                    table += "</tr>";
                }

                table += "</tbody>"; // Закрываем блок данных для каждого визита
            }

            // Конец таблицы
            table += "</table>";
            table += "</div>";

            return table;
        }
        [HttpPost]
        public void Report(DateTime dateFrom, DateTime dateTo)
        {
            if (APIAdmin.Admin == null)
            {
                throw new Exception("Вы как суда попали? Суда вход только авторизованным");
            }
            APIAdmin.PostRequest("api/reportadmin/sendmedicinesvaccinationsreporttoemail", new MedicinesVaccinationsBindingModel
            {
                FileName = "C:\\ReportsCourseWork\\pdffile.pdf",
                AdminId = APIAdmin.Admin.Id,
                DateFrom = dateFrom,
                DateTo = dateTo,
                Email = APIAdmin.Admin.Email

            });
            Response.Redirect("Report");

        }

    }
}
