using HardwareShopContracts.BindingModels;
using HardwareShopContracts.SearchModels;
using HardwareShopContracts.ViewModels;
using HardwareShopDatabaseImplement.Models;
using HardwareShopDataModels.Enums;
using HardwareShopWorkerApp.Models;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using static System.Net.Mime.MediaTypeNames;

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

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

        public IActionResult Register()
        {
            return View();
        }

        [HttpPost]
        public void Register(string login, string email, string password)
        {
            if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(email) || string.IsNullOrEmpty(password))
            {
                throw new Exception("Введите логин, email, пароль");
            }
            APIClient.PostRequest("api/user/register", new UserBindingModel
            {
                Login = login,
                Email = email,
                Password = password,
                Role = UserRole.Работник,
            });
            Response.Redirect("Enter");
            return;
        }

        public IActionResult Index()
        {
			if (APIClient.User == null)
			{
				return Redirect("~/Home/Enter");
			}
			return View();
		}

        public IActionResult Privacy()
        {
            return View();
        }

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

        public IActionResult Enter()
        {
            return View();
        }

        [HttpPost]
        public void Enter(string email, string password)
        {
            if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(password))
            {
                throw new Exception("Введите почту и пароль");
            }
            APIClient.User = APIClient.GetRequest<UserViewModel>($"api/user/login?email={email}&password={password}");
            if (APIClient.User == null)
            {
                throw new Exception("Неверные почта и/или пароль");
            }
            Response.Redirect("MainWorker");
        }

        [HttpPost]
		public void CreateBuild(string name)
        {
            if (APIClient.User == null)
            {
                throw new Exception("Вы как суда попали? Суда вход только авторизованным");
            }
            if (string.IsNullOrEmpty(name))
            {
                throw new Exception($"Имя магазина не должно быть пустым");
            }
            APIClient.PostRequest("api/build/create", new BuildBindingModel
            {
				BuildName = name,
				UserId = APIClient.User.Id
			});
            Response.Redirect("Builds");
        }

		[HttpGet]
		public BuildViewModel GetBuild(int buildId)
		{
			if (APIClient.User == null)
			{
				throw new Exception("Вы как суда попали? Суда вход только авторизованным");
			}
			if (buildId <= 0)
			{
				throw new Exception($"Идентификтаор сборки не может быть ниже или равен 0");
			}
            var result = APIClient.GetRequest<BuildViewModel>($"api/build/getBuild?buildId={buildId}");
			if (result == null)
			{
				return null;
			}
			return result;
		}

		[HttpPost]
		public void UpdateBuild(string name, int buildId)
		{
			if (APIClient.User == null)
			{
				throw new Exception("Вы как суда попали? Суда вход только авторизованным");
			}
			if (string.IsNullOrEmpty(name))
			{
				throw new Exception($"Имя сборки не должно быть пустым");
			}
			if (buildId <= 0)
			{
				throw new Exception($"Идентификтаор сборки не может быть ниже или равен 0");
			}
			APIClient.PostRequest("api/build/update", new BuildBindingModel
			{
                Id = buildId,
				BuildName = name
			});
			Response.Redirect("Builds");
		}

		
		[HttpPost]
		public void DeleteBuild(int deleteBuildId)
		{
			if (APIClient.User == null)
			{
				throw new Exception("Вы как суда попали? Суда вход только авторизованным");
			}
			if (deleteBuildId <= 0)
			{
				throw new Exception($"Идентификтаор сборки не может быть ниже или равен 0");
			}
			APIClient.PostRequest("api/build/DeleteBuild", new BuildBindingModel
			{
				Id = deleteBuildId
			});
			Response.Redirect("Builds");
		}

		public IActionResult MainWorker()
        {
            return View();
        }

        public IActionResult Comments()
        {			
			if (APIClient.User == null)
			{
				return Redirect("~/Home/Enter");
			}
			ViewBag.Builds = APIClient.GetRequest<List<BuildViewModel>>($"api/build/getbuilds?userId={APIClient.User.Id}");
			return View(APIClient.GetRequest<List<CommentViewModel>>($"api/comment/getcomments?userId={APIClient.User.Id}"));
        }

		[HttpPost]
		public void CreateComment(int buildId, string text)
		{
			if (APIClient.User == null)
			{
				throw new Exception("Вы как суда попали? Суда вход только авторизованным");
			}
			if (string.IsNullOrEmpty(text))
			{
				throw new Exception($"Текст не должен быть пустым");
			}
			if (buildId <= 0)
			{
				throw new Exception($"Идентификатор сборки должен быть больше 0");
			}
			APIClient.PostRequest("api/comment/create", new CommentBindingModel
			{
				BuildId = buildId,
				UserId = APIClient.User.Id,
				Text = text
			});
			Response.Redirect("Comments");
		}

		[HttpGet]
		public CommentViewModel GetComment(int commentId)
		{
			if (APIClient.User == null)
			{
				throw new Exception("Вы как суда попали? Суда вход только авторизованным");
			}
			if (commentId <= 0)
			{
				throw new Exception($"Идентификтаор комментария не может быть ниже или равен 0");
			}
			var result = APIClient.GetRequest<CommentViewModel>($"api/comment/getcomment?commentId={commentId}");
			if (result == null)
			{
				return null;
			}
			return result;
		}

		[HttpPost]
		public void UpdateComment(string text, int commentId)
		{
			if (APIClient.User == null)
			{
				throw new Exception("Вы как суда попали? Суда вход только авторизованным");
			}
			if (string.IsNullOrEmpty(text))
			{
				throw new Exception($"Текст комментария не должно быть пустым");
			}
			if (commentId <= 0)
			{
				throw new Exception($"Идентификтаор комментария не может быть ниже или равен 0");
			}
			APIClient.PostRequest("api/comment/update", new CommentBindingModel
			{
				Id = commentId,
				Text = text
			});
			Response.Redirect("Comments");
		}


		[HttpPost]
		public void DeleteComment(int deleteCommentId)
		{
			if (APIClient.User == null)
			{
				throw new Exception("Вы как суда попали? Суда вход только авторизованным");
			}
			if (deleteCommentId <= 0)
			{
				throw new Exception($"Идентификтаор комментария не может быть ниже или равен 0");
			}
			APIClient.PostRequest("api/comment/delete", new CommentBindingModel
			{
				Id = deleteCommentId,
			});
			Response.Redirect("Comments");
		}

		public IActionResult listComponents()
        {
            return View();
        }

        [HttpGet]
        public IActionResult Purchases()
        {
			if (APIClient.User == null)
			{
				return Redirect("~/Home/Enter");
			}
			return View(APIClient.GetRequest<List<PurchaseViewModel>>($"api/purchase/getpurchases?userId={APIClient.User.Id}"));
		}

        [HttpPost]
        public void Purchases(int id)
        {
            Response.Redirect("CreatePurchase");
        }

		[HttpGet]
		public GoodViewModel? GetGood(int Id)
		{
			if (APIClient.User == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			var result = APIClient.GetRequest<GoodViewModel?>($"api/good/getgood?id={Id}");
			if (result == null)
			{
				return default;
			}
			return result;
		}

		[HttpGet]
        public IActionResult CreatePurchase()
        {
			if (APIClient.User == null)
			{
				return Redirect("~/Home/Enter");
			}
			ViewBag.Goods = APIClient.GetRequest<List<GoodViewModel>>($"api/good/GetAllGoods");
			return View();
		}

		[HttpPost]
		public void CreatePurchase([FromBody] PurchaseBindingModel purchaseModel)
		{
			if (APIClient.User == null)
			{
				throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
			}
			if (purchaseModel.Sum <= 0)
			{
				throw new Exception("Цена должна быть больше 0");
			}
			purchaseModel.UserId = APIClient.User.Id;
			APIClient.PostRequest("api/purchase/createpurchase", purchaseModel);
		}

		[HttpGet]
		public IActionResult WorkerReport()
        {
            return View();
        }

        [HttpGet]
        public IActionResult Builds()
        {
			if (APIClient.User == null)
			{
				return Redirect("~/Home/Enter");
			} 
            return View(APIClient.GetRequest<List<BuildViewModel>>($"api/build/getbuilds?userId={APIClient.User.Id}"));
		}

        [HttpPost]
        public void Builds(int id)
        {
            Response.Redirect("LinkPurchase");
        }

        [HttpGet]
        public IActionResult LinkPurchase()
        {
            return View();
        }
    }
}