using System;
using System.Net;
using System.Web;
using System.Web.Mvc;
using Kendo.Mvc.UI;
using Kreta.BusinessLogic.Exceptions;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Security;
using Kreta.Core.Exceptions;
using Kreta.Core.FeatureToggle;
using Kreta.Enums.ManualEnums;
using Kreta.Resources;
using Kreta.Web.Areas.Adminisztracio.Models;
using Kreta.Web.Classes;
using Kreta.Web.Helpers;
using Kreta.Web.Helpers.Error;
using Kreta.Web.Helpers.Grid;
using Kreta.Web.Models.EditorTemplates;
using Kreta.Web.Security;

namespace Kreta.Web.Areas.Adminisztracio.Controllers
{
    [MvcRoleClaimsAuthorize(true)]
    [MvcRolePackageDenyAuthorize(KretaClaimPackages.IsOnlyAlkalmozott.ClaimValue)]
    [MvcRolePackageAuthorize(TanevEnum.AktEsKovTanev, KretaClaimPackages.Adminisztrator.ClaimValue)]
    public class TanarImportController : Controller
    {
        private IFeatureContext FeatureContext { get; }

        private IUploadFileValidator UploadFileValidator { get; }

        public TanarImportController(IFeatureContext featureContext, IUploadFileValidator uploadFileValidator)
        {
            FeatureContext = featureContext ?? throw new ArgumentNullException(nameof(featureContext));
            UploadFileValidator = uploadFileValidator ?? throw new ArgumentNullException(nameof(uploadFileValidator));
        }

        // GET: Adminisztracio/TanarImport
        public ActionResult Index()
        {
            var model = new TanarKIRImportModel
            {
                KirLoginModel = new KIRLoginModel()
                {
                    OmAzonosito = ClaimData.OrganizationCode,
                },
                KIRImportEnabled = FeatureContext.IsEnabled(Core.Constants.FeatureName.KIRImport),
                MaxAllowedFileSizeInBytes = UploadFileValidator.Configuration.ImportMaxAllowedFileSizeInBytes,
                AllowedFileExtensions = UploadFileValidator.Configuration.ImportAllowedFileExtensions
            };

            return View(model);
        }

        public ActionResult OpenKIRTanarImportPopup(TanarKIRImportModel model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    var kirHelper = new KirHelper(ConnectionTypeExtensions.GetSessionConnectionType(), model.KirLoginModel.OmAzonosito, model.KirLoginModel.FelhasznaloNev, jelszo: model.KirLoginModel.Jelszo);

                    var tanaresTanuloKIRImportModel = new TanarKIRImportModel
                    {
                        TanevId = ClaimData.SelectedTanevID.Value,
                        FeladatellatasiHelyId = model.FeladatellatasiHelyId,
                        KIRImportModel = new KIRImportModel
                        {
                            OmAzonosito = model.KirLoginModel.OmAzonosito,
                            KirToken = kirHelper.KirToken,
                            TelephelyList = kirHelper.GetTelephelyList().ToSelectListItemList(),
                            FelhasznaloNev = model.KirLoginModel.FelhasznaloNev
                        },
                        KirLoginModel = new KIRLoginModel
                        {
                            OmAzonosito = model.KirLoginModel.OmAzonosito,
                            FelhasznaloNev = model.KirLoginModel.FelhasznaloNev
                        },
                    };
                    var pm = new PopUpModel(tanaresTanuloKIRImportModel, "KIRTanarImportModal");
                    pm.AddCancelBtn(pm, "KretaWindowHelper.destroyAllWindow");
                    pm.AddBtn(pm, "BtnKIRImport", 3486 /*Importálás*/, "KIRTanarImportHelper.KIRImport");

                    return PartialView(Constants.General.PopupView, pm);
                }
                catch (BlException e)
                {
                    throw new StatusError(HttpStatusCode.BadRequest, e.Message);
                }
            }

            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        public ActionResult KIRImport(TanarKIRImportModel model, int feladatellatasiHelyId)
        {
            if (ModelState.IsValid)
            {
                var kirHelper = new KirHelper(ConnectionTypeExtensions.GetSessionConnectionType(), model.KIRImportModel.OmAzonosito, model.KIRImportModel.FelhasznaloNev, kirToken: model.KIRImportModel.KirToken);

                var tanarList = kirHelper.GetPedagogusList(model.KIRImportModel.TelephelyKod.Value);

                var egysegesImportHelper = new EgysegesImportHelper(ConnectionTypeExtensions.GetSessionConnectionType());

                egysegesImportHelper.ExecuteKIRTanarImport(tanarList);
            }

            return new HttpStatusCodeResult(HttpStatusCode.OK);
        }

        public ActionResult OpenTanarImportPopUp(int feladatellatasiHelyId)
        {
            var helper = new EgysegesImportHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var tanarokFeltolteseModel = new TanarokFeltolteseModel
            {
                TanevId = ClaimData.SelectedTanevID.Value,
                FeladatellatasiHelyId = feladatellatasiHelyId,
                Errors = helper.TanarKIRAdatok.Validate()
            };

            var model = new PopUpModel(tanarokFeltolteseModel, "TanarokFeltolteseModal");
            model.AddCancelBtn(model, "KretaWindowHelper.destroyAllWindow");

            if (tanarokFeltolteseModel.Errors.Count == 0)
            {
                model.AddOkBtn(model, "KIRTanarFeltoltesHelper.Save");
            }

            return PartialView(Constants.General.PopupView, model);
        }

        public ActionResult UploadKIRTanarFile(HttpPostedFileBase importTanarFile)
        {
            UploadFileValidator.ValidateImportFile(importTanarFile);

            try
            {
                var helper = new EgysegesImportHelper(ConnectionTypeExtensions.GetSessionConnectionType());

                helper.ExecuteKIRTanarImportFile(importTanarFile.InputStream, importTanarFile.FileName, ClaimData.IsSzakkepzoIntezmeny);
            }
            catch (KretaInvalidFileFormatException e)
            {
                throw new StatusError(HttpStatusCode.BadRequest, e.Message);
            }
            catch (Exception e)
            {
                throw new StatusError(HttpStatusCode.BadRequest, e.Message);
            }

            return Content(string.Empty);
        }

        public ActionResult SaveTanarok(int feladatellatasiHelyId)
        {
            if (ModelState.IsValid)
            {
                var helper = new EgysegesImportHelper(ConnectionTypeExtensions.GetSessionConnectionType());

                LicenceHelper.LicenceWait(ClaimData.LicenceDatum);
                helper.SaveImportaltTanarok(feladatellatasiHelyId);

                return Json(new { tovabbUrl = @"/Alkalmazott/Alkalmazott" });
            }

            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        public ActionResult GetPreLoadedTeachers(DataSourceRequest request)
        {
            var helper = new EgysegesImportHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            helper.GridParameters = Converter.GridParameter(request);
            return Json(helper.GetImportaltTanarok().ToDataSourceResult(), JsonRequestBehavior.AllowGet);
        }

        public ActionResult DownloadTemplate()
        {
            string filePath = Kreta.Web.Classes.Utils.GetExcelTemplateFilePath(Constants.ImportExport.AlkalmazottImportSablonNev);

            if (filePath == null)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.FajlNemLetezik);
            }

            return File(filePath, Core.Constants.ContentTypes.Xlsx, Constants.ImportExport.AlkalmazottImportSablonNev);
        }

        public ActionResult ExportAktualisAdatok()
        {
            var memoryStream = new EgysegesImportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).ExportTanarAktualisAdatok();
            return new FileStreamResult(memoryStream, Core.Constants.ContentTypes.Xlsx) { FileDownloadName = $"{AlkalmazottResource.Alkalmazottak_Export}.{Constants.ImportExport.FileFormatXlsx}" };
        }
    }
}