using CandidateReviewClientApp.Models;
using CandidateReviewContracts.BindingModels;
using CandidateReviewContracts.ViewModels;
using CandidateReviewDataModels.Models;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;

namespace CandidateReviewClientApp.Controllers
{
    public class AssessmentController : Controller
    {
        private readonly ILogger<AssessmentController> _logger;

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

        [HttpPost]
        public IActionResult AddAssessment(int resumeId, string comment, Dictionary<int, int> criteriaValues)
        {
            string returnUrl = HttpContext.Request.Headers["Referer"].ToString();
            try
            {
                var userId = APIClient.User?.Id;
                var allCriterions = APIClient.GetRequest<List<CriterionViewModel>>("api/criterion/list");
                if (allCriterions == null || !allCriterions.Any())
                {
                    throw new Exception("Критерии не найдены");
                }

                criteriaValues = criteriaValues.Where(kvp => kvp.Key != 0).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

                var assessmentCriterions = criteriaValues
                    .ToDictionary(
                        kvp => kvp.Key,
                        kvp =>
                        {
                            var criterionViewModel = allCriterions.FirstOrDefault(c => c.Id == kvp.Key);
                            if (criterionViewModel == null)
                            {
                                throw new InvalidOperationException($"Критерий с ID {kvp.Key} не найден.");
                            }

                            var criterionModel = new CriterionViewModel
                            {
                                Id = criterionViewModel.Id,
                                Name = criterionViewModel.Name
                            };

                            return ((ICriterionModel)criterionModel, kvp.Value);
                        }
                    );

                APIClient.PostRequest("api/assessment/create", new AssessmentBindingModel
                {
                    ResumeId = resumeId,
                    UserId = userId,
                    Comment = comment,
                    AssessmentCriterions = assessmentCriterions
                });

                return Redirect($"~/Resume/ResumeDetails/{resumeId}");
            }
            catch (Exception ex)
            {
                return RedirectToAction("Error", new { errorMessage = $"{ex.Message}", returnUrl });
            }
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error(string errorMessage, string returnUrl)
        {
            ViewBag.ErrorMessage = errorMessage ?? "Произошла непредвиденная ошибка.";
            ViewBag.ReturnUrl = returnUrl;
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}