using Microsoft.AspNetCore.Mvc;
using PolyclinicBusinessLogic.BusinessLogics;
using PolyclinicBusinessLogic.OfficePackage.HelperEnums;
using PolyclinicContracts.BindingModels;
using PolyclinicContracts.BusinessLogicsContracts;
using PolyclinicContracts.SearchModels;
using PolyclinicContracts.ViewModels;
using PolyclinicWebAppImplementer.Models;

namespace PolyclinicWebAppImplementer.Controllers
{
    public class ReportsController : Controller
    {
        private readonly IImplementerReportLogic _reportLogic;
        private readonly IDiagnoseLogic _diagnoseLogic;
        private readonly SendMailLogic _sendMailLogic;

        public ReportsController(IImplementerReportLogic reportLogic, IDiagnoseLogic diagnoseLogic, SendMailLogic sendMailLogic)
        {
            _reportLogic = reportLogic;
            _diagnoseLogic = diagnoseLogic;
            _sendMailLogic = sendMailLogic;
        }

        [HttpGet]
        [HttpPost]
        public IActionResult DiagnosesByPeriod(DiagnosesByPeriodFormModel model)
        {
            var currentUser = LoginManager.LogginedUser;
            if (currentUser == null)
            {
                return RedirectToAction("Login", "User");
            }
            if (HttpContext.Request.Method == "GET")
            {
                return View(model);
            }
            else
            {
                var report = _reportLogic.GetReportDiagnosesByPeriod(model.DateStart, model.DateEnd);
                if (model.ReportType == ReportType.Web)
                {
                    model.Report = report;
                }
                else
                {
                    ReportBindingModel reportInfo = new()
                    {
                        FileName = "diagnosesByPeriod.pdf",
                        DateFrom = model.DateStart,
                        DateTo = model.DateEnd
                    };

                    _reportLogic.SaveReportDiagnosesByPeriodToPdfFile(reportInfo, report);

                    var fileName = reportInfo.FileName;
                    var filePath = Path.Combine(Directory.GetCurrentDirectory(), fileName);
                    byte[] fileBytes = System.IO.File.ReadAllBytes(filePath);

                    if (System.IO.File.Exists(filePath))
                    {
                        try
                        {
                            string txt = reportInfo.GetPeriodString();
                            var userEmail = currentUser.Email;
                            _sendMailLogic.SendEmail(userEmail, $"Здравствуйте, {currentUser.FIO}! В приложении отчет по болезням {txt} от {DateTime.Now.ToString()}", filePath);

                            model.Message = $"Отчет в формате .pdf был отправлен на почту {currentUser.Email}";
                            return View(model);
                        }
                        catch (Exception)
                        {
                            model.Error = $"Произошла ошибка при отправке отчета";
                        }
                    }
                    else
                    {
                        model.Error = "Произошла ошибка при генерации отчета";
                    }
                }
                return View(model);
            }
        }

        [HttpGet]
        [HttpPost]
        public IActionResult MedicamentsByDiagnoses(MedicamentsByDiagnosesFormModel model)
        {
            var currentUser = LoginManager.LogginedUser;
            if (currentUser == null)
            {
                return RedirectToAction("Login", "User");
            }
            var diagnoses = _diagnoseLogic.ReadList(new DiagnoseSearchModel { UserId = currentUser.Id });
            if (model.SelectedDiagnoses != null)
            {
                model.Diagnoses = diagnoses.Select(x => (x, model.SelectedDiagnoses.Contains(x.Id))).ToList();
            }
            else
            {
                model.Diagnoses = diagnoses.Select(x => (x, false)).ToList();
            }
            if (HttpContext.Request.Method == "GET")
            {
                return View(model);
            }
            else
            {
                var reportInfo = new ReportBindingModel();

                var reportModel = _reportLogic.GetReportMedicamentsByDiagnoses(model.SelectedDiagnoses);

                if (model.ReportType == ReportType.Word)
                {
                    reportInfo.FileName = model.FileName + ".docx";
                    _reportLogic.SaveReportMedicamentsByDiagnosesToWordFile(reportInfo, reportModel);
                }
                else
                {
                    reportInfo.FileName = model.FileName + ".xlsx";
                    _reportLogic.SaveReportMedicamentsByDiagnosesToExcelFile(reportInfo, reportModel);
                }

                var filePath = Path.Combine(Directory.GetCurrentDirectory(), reportInfo.FileName);
                byte[] fileBytes = System.IO.File.ReadAllBytes(filePath);
                string mimeType = model.ReportType == ReportType.Word ? "application/vnd.openxmlformats-officedocument.wordprocessingml.document" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

                return File(fileBytes, mimeType, reportInfo.FileName);
            }
        }
    }
}