using System;
using System.Linq;
using System.Net;
using System.Web.Mvc;
using Kreta.BusinessLogic.HelperClasses;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Helpers.SystemSettings;
using Kreta.BusinessLogic.Security;
using Kreta.Core.FeatureToggle;
using Kreta.Enums;
using Kreta.Enums.ManualEnums;
using Kreta.Web.Areas.Adminisztracio.Helpers;
using Kreta.Web.Areas.Adminisztracio.Models;
using Kreta.Web.Controllers;
using Kreta.Web.Helpers;
using Kreta.Web.Helpers.Modal;
using Kreta.Web.Models;
using Kreta.Web.Models.EditorTemplates;
using Kreta.Web.Security;
using Kreta.Web.Utils;

namespace Kreta.Web.Areas.Adminisztracio.Controllers
{
    [MvcRoleClaimsAuthorize(true)]
    [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.Naplo.ClaimValue, KretaClaimPackages.Ellenorzo.ClaimValue)]
    public class ProfilController : Controller
    {
        /// <summary>
        /// Default view visszaadás
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            var systemSettingsHelper = new SystemSettingsHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var model = new ProfilModel
            {
                IsElerhetosegAdatokSzerkeszthetoek = systemSettingsHelper.GetSystemSettingValue<bool>(RendszerBeallitasTipusEnum.tanulok_es_gondviselok_szerkesztheti_sajat_elerhetosegi_adataikat)
            };

            return View("Index", model);
        }

        [HttpPost]
        public ActionResult GenerateNewEgyhaztartasbanElokRow(EgyhaztartasbanElokRowModel model)
        {
            return View("EgyHaztartasbanLevokRow", model);
        }

        private readonly IFeatureContext FeatureContext;

        public ProfilController(IFeatureContext featureContext)
        {
            FeatureContext = featureContext;
        }

        public SajatAdatlapInfoModel GetDataForInfo(int id)
        {
            if (ClaimManager.HasPackage(KretaClaimPackages.Naplo.ClaimValue) || ClaimManager.HasPackage(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.Naplo.ClaimValue))
            {
                return new ProfilHelper().GetTanarSajatAdatlapDataForInfo(id);
            }
            if (ClaimManager.HasPackage(KretaClaimPackages.Ellenorzo.ClaimValue))
            {
                if (ClaimData.GondviseloId.HasValue)
                {
                    return new ProfilHelper().GetGondviseloSajatAdatlapDataForInfo(ClaimData.GondviseloId.Value, Request.Url.Host);
                }
                return new ProfilHelper().GetTanuloSajatAdatlapDataForInfo(id, Request.Url.Host);
            }
            throw new Exception();
        }

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.Naplo.ClaimValue, KretaClaimPackages.Ellenorzo.ClaimValue)]
        public ActionResult SajatAdatlapPopUp()
        {
            SajatAdatlapInfoModel alkalmazottModel = GetDataForInfo(ClaimData.FelhasznaloId);
            alkalmazottModel.HideControlsForAlkalmazott = true;

            var model = new PopUpModel(alkalmazottModel, "Info_SajatAdatlap");

            model.Buttons.Add(new ModalButtonModel() { Name = "BtnSajatAdatlapBezaras", Text = Resources.CommonResource.Bezaras, EventName = "SajatAdatlapHelper.closeSajatAdatlapPopUp" });

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

        public ActionResult LoadJelszoModositas()
        {
            var model = new ProfilModel
            {
                JelszoValtoztatasNemLehetseges = ClaimManager.GetClaimIdentity().HasClaim(KretaClaimTypes.Resource, KretaClaimPackages.Ellenorzo.Resources.A_felhasznalok_nem_valtoztathatjak_meg_a_jelszavukat_az_elektronikus_ellenorzoben)
            };
            return PartialView("JelszoModositas_Bevitel", model);
        }

        public ActionResult LoadProfilkepFeltoltes()
        {
            var model = new ProfilModel();
            return PartialView("ProfilkepFeltoltes_Bevitel", model);
        }

        public ActionResult LoadTippekBeallitasa()
        {
            var model = new TippModel();
            model.TippekElrejtese = ProfileUtils.HideTips;
            model.EmailHelyettesites = ProfileUtils.EmailHelyettesites;
            model.HianyzokAutoKitoltes = ProfileUtils.IsHianyzokAutoKitoltesEnabled;
            model.FogadooraEmail = ProfileUtils.FogadooraEmail;
            model.FogadooraEmailUj = ProfileUtils.FogadooraEmailUj;
            model.FogadooraEmailJelentkezes = ProfileUtils.FogadooraEmailJelentkezes;
            model.FogadooraEmailJelentkezesLemondas = ProfileUtils.FogadooraEmailJelentkezesLemondas;
            model.FogadooraEmlekeztetoEmailJelentkezes = ProfileUtils.FogadooraEmlekeztetoEmailJelentkezes;
            model.FogadooraEmailTorles = ProfileUtils.FogadooraEmailTorles;
            model.FogadooraEmail3Nappal = ProfileUtils.FogadooraEmail3Nappal;
            model.FogadooraEmail1Nappal = ProfileUtils.FogadooraEmail1Nappal;
            model.NemNaplozottTanorakEmail = ProfileUtils.NemNaplozottTanorakEmail;
            model.AtlagMegjelenitesTipusa = (int)ProfileUtils.AtlagMegjelenitesTipusa;
            model.AtlagbaBeleszamitoOsztalyTipusa = (int)ProfileUtils.AtlagbaBeleszamitoOsztalyTipusa;
            model.AtlagMegjelenitesTipusaList = new ComboBoxHelperEnumApiController(FeatureContext).GetAtlagMegjelenitesTipusList();
            model.AtlagbaBeleszamitoOsztalyTipusaList = new ComboBoxHelperEnumApiController(FeatureContext).GetAtlagbaBeleszamitoOsztalyTipusList();
            model.HaladasiNaploFulTipusa = (int)ProfileUtils.HaladasiNaploFulTipusa;
            model.HaladasiNaploFulTipusaList = new ComboBoxHelperEnumApiController(FeatureContext).GetHaladasiNaploFulTipusList();
            model.HaladasiNaploNezetTipusa = (int)ProfileUtils.HaladasiNaploNezetTipusa;
            model.HaladasiNaploNezetTipusaList = new ComboBoxHelperEnumApiController(FeatureContext).GetHaladasiNaploNezetTipusList();
            model.HetirendMegjeleniteseBelepeskor = ProfileUtils.HetirendMegjeleniteseBelepeskor;

            return PartialView("Tippek_Beallitas", model);
        }

        public ActionResult LoadElerhetosegekSzerk()
        {
            var elerhetosegek = new FelhasznaloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetElerhetosegek(ClaimData.FelhasznaloId);
            var model = ConvertElerhetosegekModCoToModel(elerhetosegek);
            return PartialView("ElerhetosegekModositas_Bevitel", model);
        }

        public ActionResult LoadElerhetosegek()
        {
            var elerhetosegek = new FelhasznaloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetElerhetosegek(ClaimData.FelhasznaloId);
            var model = ConvertElerhetosegekModCoToModel(elerhetosegek);
            return PartialView("ElerhetosegekMegjelenitese", model);
        }

        public ActionResult LoadGondviseloAdatokSzerk()
        {
            var model = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetGondviseloElerhetosegAdatok(ClaimData.GondviseloId.Value);

            return PartialView("GondviseloAdatokSzerkesztese", ConvertGondviseloAdatokModCOToModel(model));
        }

        public ActionResult LoadGondviseloAdatok()
        {
            var model = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetGondviseloElerhetosegAdatok(ClaimData.GondviseloId.Value);

            return PartialView("GondviseloAdatokMegjelenitese", ConvertGondviseloAdatokModCOToModel(model));
        }

        public ActionResult LoadGondviselo4TSzerkesztese()
        {
            if (!ClaimData.FeltarGondviseloEnabled)
            {
                return PartialView("Empty");
            }

            var co = new GondviseloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetGondviselo4TAdatok(ClaimData.GondviseloId.Value);
            return PartialView("Gondviselo4TAdatokSzerkesztese", new Gondviselo4TAdatokModel(co));
        }

        [HttpPost]
        [MvcValidateAjaxAntiForgeryToken]
        public ActionResult TippBeallitasokMentese(TippModel model)
        {
            ProfileUtils.HideTips = model.TippekElrejtese;
            ProfileUtils.EmailHelyettesites = model.EmailHelyettesites;
            ProfileUtils.IsHianyzokAutoKitoltesEnabled = model.HianyzokAutoKitoltes;
            ProfileUtils.FogadooraEmail = model.FogadooraEmail;
            ProfileUtils.FogadooraEmailUj = model.FogadooraEmailUj;
            ProfileUtils.FogadooraEmailJelentkezes = model.FogadooraEmailJelentkezes;
            ProfileUtils.FogadooraEmailJelentkezesLemondas = model.FogadooraEmailJelentkezesLemondas;
            ProfileUtils.FogadooraEmlekeztetoEmailJelentkezes = model.FogadooraEmlekeztetoEmailJelentkezes;
            ProfileUtils.FogadooraEmailTorles = model.FogadooraEmailTorles;
            ProfileUtils.FogadooraEmail3Nappal = model.FogadooraEmail3Nappal;
            ProfileUtils.FogadooraEmail1Nappal = model.FogadooraEmail1Nappal;
            ProfileUtils.NemNaplozottTanorakEmail = model.NemNaplozottTanorakEmail;
            ProfileUtils.AtlagMegjelenitesTipusa = (AtlagMegjelenitesTipus)model.AtlagMegjelenitesTipusa;
            ProfileUtils.AtlagbaBeleszamitoOsztalyTipusa = (AtlagbaBeleszamitoOsztalyTipus)model.AtlagbaBeleszamitoOsztalyTipusa;
            ProfileUtils.HaladasiNaploFulTipusa = (HaladasiNaploFulTipus)model.HaladasiNaploFulTipusa;
            ProfileUtils.HaladasiNaploNezetTipusa = (HaladasiNaploNezetTipus)model.HaladasiNaploNezetTipusa;
            ProfileUtils.HetirendMegjeleniteseBelepeskor = model.HetirendMegjeleniteseBelepeskor;

            ProfileUtils.SaveUserProfileDocument();

            return new HttpStatusCodeResult(HttpStatusCode.OK);
        }

        private GondviseloAdatokModModel ConvertGondviseloAdatokModCOToModel(GondviseloAdatokModCO co)
        {
            return new GondviseloAdatokModModel
            {
                AktEmail = co.AktEmail,
                AktTelefon = co.AktTelefon
            };
        }

        private ElerhetosegekModel ConvertElerhetosegekModCoToModel(ElerhetosegekModCO co)
        {
            return new ElerhetosegekModel
            {
                Email = co.Email.Select(e => new EmailElerhetosegModel
                {
                    Alapertelmezett = e.Alapertelmezett,
                    EmailCim_Input = e.EmailCim,
                    Tipus = e.Tipus,
                    Id = e.Id,
                    Status = e.Status
                }).ToList(),
                Telefon = co.Telefon.Select(t => new TelefonElerhetosegModel
                {
                    Alapertelmezett = t.Alapertelmezett,
                    Telefonszam = t.Telefonszam,
                    Tipus = t.Tipus,
                    Id = t.Id,
                    Status = t.Status
                }).ToList()
            };
        }
    }
}