using Microsoft.AspNetCore.Mvc;
using PharmacistApp.Models;
using System.Diagnostics;
using VetClinicContracts.BindingModels;
using VetClinicContracts.ViewModels;
using VetClinicDataBaseImplement.Models;
using VetClinicDataModels.Models;

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

		public HomeController(ILogger<HomeController> logger)
		{
			_logger = logger;
		}

		public IActionResult Index()
		{
			if (APIPharmacist.Pharmacist == null)
			{
				return Redirect("~/Home/Enter");
			}
			return
View(APIPharmacist.GetRequest<List<MedicineViewModel>>($"api/medicine/getmedicines?pharmacistid={
	APIPharmacist.Pharmacist.Id}"));

		}

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

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

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

		public IActionResult CreateMedicine()
		{
			if (APIPharmacist.Pharmacist == null)
			{
				return Redirect("~/Home/Enter");
			}
			return View();
		}



		[HttpPost]
		public void CreateMedicine(string name, int price)
		{
			if (APIPharmacist.Pharmacist == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			if (string.IsNullOrEmpty(name) || price <= 0)
			{
				throw new Exception("Ошибка в введенных данных");
			}
			APIPharmacist.PostRequest("api/medicine/createmedicine", new MedicineBindingModel
			{
				MedicineName = name,
				Price = price,
				PharmacistId = APIPharmacist.Pharmacist.Id
			}) ;
			Response.Redirect("Index");
		}

		public IActionResult DeleteMedicine()
		{
			if (APIPharmacist.Pharmacist == null)
			{
				return Redirect("~/Home/Enter");
			}
			ViewBag.Medicines = APIPharmacist.GetRequest<List<MedicineViewModel>>($"api/medicine/getmedicines?pharmacistid={APIPharmacist.Pharmacist.Id}");
			return View();
		}

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

		public IActionResult UpdateMedicine()
		{
			if (APIPharmacist.Pharmacist == null)
			{
				return Redirect("~/Home/Enter");
			}
			ViewBag.Medicines = APIPharmacist.GetRequest<List<MedicineViewModel>>($"api/medicine/getmedicines?pharmacistid={APIPharmacist.Pharmacist.Id}");
			return View();
		}

		[HttpPost]
		public void UpdateMedicine(int medicine, string name, int price, 
			Dictionary<int, IAnimalModel> medicineAnimals = null)
		{
			if (APIPharmacist.Pharmacist == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			if (string.IsNullOrEmpty(name) || price <= 0)
			{
				throw new Exception("Ошибка в введенных данных");
			}
			APIPharmacist.PostRequest("api/medicine/updatemedicine", new MedicineBindingModel
			{
				Id = medicine,
				MedicineName = name,
				Price = price,
				PharmacistId = APIPharmacist.Pharmacist.Id,
				MedicineAnimals = medicineAnimals
			});
			Response.Redirect("Index");
		}

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

		[HttpGet]
		public Tuple<MedicineViewModel, string>? GetMedicine(int medicineId)
		{
			if (APIPharmacist.Pharmacist == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			var result = APIPharmacist.GetRequest<Tuple<MedicineViewModel, List<string>>>($"api/medicine/getmedicine?medicineid={medicineId}");
			if (result == null)
			{
				return default;
			}
			string table = "";
			result.Item1.MedicineAnimals.Clear();
			for (int i = 0; i < result.Item2.Count; i++)
			{
				var animal = result.Item2[i];
				table += "<tr>";
				table += $"<td>{animal}</td>";
				table += "</tr>";
			}
			return Tuple.Create(result.Item1, table);
		}

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