using System.Collections.Generic;
using System.Web.Http;
using System.Web.Mvc;
using Kreta.BusinessLogic.Classes;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Helpers.SystemSettings;
using Kreta.BusinessLogic.Interfaces;
using Kreta.BusinessLogic.Security;
using Kreta.Client.Leltar;
using Kreta.Core.FeatureToggle;
using Kreta.Enums;
using Kreta.Enums.ManualEnums;
using Kreta.Framework;
using Kreta.Web.Areas.Alkalmazott.ApiControllers;
using Kreta.Web.Areas.Alkalmazott.Models;
using Kreta.Web.Helpers;
using Kreta.Web.Helpers.Modal;
using Kreta.Web.Models.EditorTemplates;
using Kreta.Web.Security;
using HttpPostAttribute = System.Web.Mvc.HttpPostAttribute;

namespace Kreta.Web.Areas.Alkalmazott.Controllers
{
    [MvcRoleClaimsAuthorize(true)]
    [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
    public class AlkalmazottController : BaseAlkalmazottController
    {

        public AlkalmazottController(IFeatureContext featureContext, IKozpontiKretaHelper kozpontiKretaHelper, ILeltarClient leltarClient)
            : base(featureContext, kozpontiKretaHelper, leltarClient)
        {
        }

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public ActionResult Index(string filter)
        {
            var model = AlkalmazottSearchModel.SetFilterAlkalmazottSearchModel(filter);
            model.MunkaugyiAdatokKlebelsbergOrNSZFH =
                _featureContext.IsEnabled(Core.Constants.FeatureName.MunkaugyiAdatokKlebelsberg)
                || _featureContext.IsEnabled(Core.Constants.FeatureName.MunkaugyiAdatokNSZFH);
            model.FeladatEllatasiHelyId = ClaimData.FelhelySzuro;
            return View(Constants.ViewNames.Index, model);
        }

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public ActionResult ErrorIndex(bool? NANem, bool? NABesorolasiFokozat, bool? nincsMunkakor, bool? nincsFoglalkoztatsModja, bool? nincsEmail)
        {
            var model = new AlkalmazottSearchModel();

            if (NANem.HasValue && NANem.Value)
            {
                model.NANem = NANem;
                model.Nem = (int)NemEnum.NA;
            }

            if (NABesorolasiFokozat.HasValue && NABesorolasiFokozat.Value)
            {
                model.NABesorolasiFokozat = NABesorolasiFokozat;
                model.SearchPedagogusFokozat = (int)BesorolasiFokozatTipusEnum.na;
            }

            if (nincsMunkakor.HasValue && nincsMunkakor.Value)
            {
                model.NincsMunkakor = nincsMunkakor;
            }

            if (nincsFoglalkoztatsModja.HasValue && nincsFoglalkoztatsModja.Value)
            {
                model.NincsFoglalkoztatsModja = nincsFoglalkoztatsModja;
            }

            if (nincsEmail.HasValue && nincsEmail.Value)
            {
                model.NincsEmail = nincsEmail;
            }

            model.MunkaugyiAdatokKlebelsbergOrNSZFH =
                _featureContext.IsEnabled(Core.Constants.FeatureName.MunkaugyiAdatokKlebelsberg)
                || _featureContext.IsEnabled(Core.Constants.FeatureName.MunkaugyiAdatokNSZFH);

            return View(Constants.ViewNames.Index, model);
        }

        public ActionResult OpenNewAlkalmazottPopUp()
        {
            return base.OpenNewAlkalmazottPopUp();
        }

        public ActionResult OpenUjBetoltetlenAllashelyPopUp()
        {
            var api = new AlkalmazottApiController(_leltarClient);
            var alkalmazottModel = api.CreateNewBetoltetlenAllashelyModel();

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

            model.AddCancelBtn(model, "AlkalmazottHelper.betoltetlenAllashelyCancel");
            model.AddOkBtn(model, "AlkalmazottHelper.betoltetlenAllashelySave");

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

        public ActionResult OpenUjHitoktatoRogzitesePopUp()
        {
            var api = new AlkalmazottApiController(_leltarClient);
            var alkalmazottModel = api.CreateNewHitoktatoModel();

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

            model.AddCancelBtn(model, "AlkalmazottHelper.hitOktatoCancel");
            model.AddOkBtn(model, "AlkalmazottHelper.hitOktatoSave");

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

        public ActionResult OpenUjKulsosAlkalmazottRogzitesePopUp()
        {
            var api = new AlkalmazottApiController(_leltarClient);
            var alkalmazottModel = api.CreateNewKulsosAlkalmazottModel();

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

            model.AddCancelBtn(model, "AlkalmazottHelper.kulsosAlkalmazottCancel");
            model.AddOkBtn(model, "AlkalmazottHelper.kulsosAlkalmazottSave");

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

        public ActionResult OpenUjKulsoGyakorlatiAllashelyRogzitesePopUp()
        {
            var api = new AlkalmazottApiController(_leltarClient);
            var alkalmazottModel = api.CreateNewKulsoGyakorlatiAllashelyModel();

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

            model.AddCancelBtn(model, "AlkalmazottHelper.kulsoGyakorlatiAllashelyCancel");
            model.AddOkBtn(model, "AlkalmazottHelper.kulsoGyakorlatiAllashelySave");

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

        public ActionResult OpenUjDualisKepzohelyiOktatoRogzitesePopUp()
        {
            return OpenUjDualisKepzohelyiOktatoRogzitesePopUp(false);
        }

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public ActionResult OpenAlkalmazottInfoPopUp(int alkalmazottId)
        {
            return base.OpenAlkalmazottInfoPopUp(alkalmazottId, false);
        }

        /// <summary>
        /// Tanulók adatainál a tanárok és tantárgyak fülön a tanár neve linkbutton, ami ezt az Actiont hívja meg
        /// </summary>
        /// <param name="alkalmazottId"></param>
        /// <returns></returns>
        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public ActionResult OpenTanuloTanarInfoPopUp(int alkalmazottId)
        {
            return base.OpenTanuloTanarInfoPopUp(alkalmazottId);
        }

        public ActionResult NewElerhetosegCim(int alkalmazottId)
        {
            return base.NewElerhetosegCim(alkalmazottId);
        }

        public ActionResult ModElerhetosegCim(int cimId, bool? isKozpontilagSzinkronizalt)
        {
            return base.ModElerhetosegCim(cimId, isKozpontilagSzinkronizalt);
        }

        public ActionResult NewElerhetosegTel(int alkalmazottId)
        {
            return base.NewElerhetosegTel(alkalmazottId);
        }

        public ActionResult ModElerhetosegTel(int id)
        {
            return base.ModElerhetosegTel(id);
        }

        public ActionResult NewElerhetosegEmail(int alkalmazottId)
        {
            return base.NewElerhetosegEmail(alkalmazottId);
        }

        public ActionResult ModElerhetosegEmail(int id)
        {
            return base.ModElerhetosegEmail(id);
        }

        public ActionResult OpenModifyAlkalmazottPopUp(int alkalmazottId)
        {
            return OpenModifyAlkalmazottPopUp(alkalmazottId, false);
        }

        public ActionResult OpenNewPedagogusEletpalyamodellPopUp(int alkalmazottId)
        {
            var pedagogusEletpalyamodellModel = new PedagogusEletpalyamodellModel
            {
                AlkalmazottId = alkalmazottId
            };

            var model = new PopUpModel(pedagogusEletpalyamodellModel, "New_PedagogusEletpalyamodell");

            model.Buttons.Add(new ModalButtonModel() { Name = "BtnPedagogusEletpalyamodellCancel", Text = Resources.CommonResource.Megse, EventName = "PedagogusEletpalyamodellHelper.newPedagogusEletpalyamodellCancel" });
            model.Buttons.Add(new ModalButtonModel() { Name = "BtnPedagogusEletpalyamodellOk", Text = Resources.CommonResource.Mentes, EventName = "PedagogusEletpalyamodellHelper.newPedagogusEletpalyamodellSave" });

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

        public ActionResult OpenModifyPedagogusEletpalyamodellPopUp(int id)
        {
            var apiController = new AlkalmazottApiController(_leltarClient);
            var pedagogusEletpalyamodellModel = apiController.GetPedagogusEletpalyamodell(id);

            var model = new PopUpModel(pedagogusEletpalyamodellModel, "New_PedagogusEletpalyamodell");

            model.Buttons.Add(new ModalButtonModel() { Name = "BtnPedagogusEletpalyamodellCancel", Text = Resources.CommonResource.Megse, EventName = "PedagogusEletpalyamodellHelper.modifyPedagogusEletpalyamodellCancel" });
            model.Buttons.Add(new ModalButtonModel() { Name = "BtnPedagogusEletpalyamodellOk", Text = Resources.CommonResource.Mentes, EventName = "PedagogusEletpalyamodellHelper.modifyPedagogusEletpalyamodellSave" });

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

        public ActionResult OpenNewVegzettsegekPopUp(int alkalmazottId)
        {
            var vegzettsegModel = new VegzettsegModel
            {
                AlkalmazottId = alkalmazottId
            };

            var model = new PopUpModel(vegzettsegModel, "New_Vegzettsegek");

            model.Buttons.Add(new ModalButtonModel() { Name = "BtnVegzettsegCancel", Text = Resources.CommonResource.Megse, EventName = "VegzettsegHelper.newVegzettsegCancel" });
            model.Buttons.Add(new ModalButtonModel() { Name = "BtnVegzettsegOk", Text = Resources.CommonResource.Mentes, EventName = "VegzettsegHelper.newVegzettsegSave" });

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

        public ActionResult OpenModifyVegzettsegekPopUp(int id)
        {
            var apiController = new AlkalmazottApiController(_leltarClient);
            var vegzettsegModel = apiController.GetVegzettsegek(id);

            var model = new PopUpModel(vegzettsegModel, "New_Vegzettsegek");

            model.Buttons.Add(new ModalButtonModel() { Name = "BtnVegzettsegCancel", Text = Resources.CommonResource.Megse, EventName = "VegzettsegHelper.modifyVegzettsegCancel" });
            model.Buttons.Add(new ModalButtonModel() { Name = "BtnVegzettsegOk", Text = Resources.CommonResource.Mentes, EventName = "VegzettsegHelper.modifyVegzettsegSave" });

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

        public ActionResult OpenNewTovabbiMunkaugyiAdatokPopUp(int alkalmazottId)
        {
            var systemSettingsHelper = new SystemSettingsHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var egy_statuszra_juto_kotelezo_oraszam = systemSettingsHelper.GetSystemSettingValue<double>(RendszerBeallitasTipusEnum.Egy_statuszra_juto_kotelezo_oraszam);

            var tovabbiMunkaugyiAdatokModel = new TovabbiMunkaugyiAdatokModel
            {
                AlkalmazottId = alkalmazottId,
                FoglalkoztatasiJogviszony = (int)MunkaviszonyTipusEnum.megbizasi_jogviszony,
                FoglalkoztatasTipusa = (int)FoglalkoztatasTipusaEnum.TeljesMunkaidos,
                VezetoiOraszamOka = (int)VezetoiOraszamokTipusEnum.Nincs,
                Oraszam = egy_statuszra_juto_kotelezo_oraszam
            };

            if (ApplicationData.SystemType == SystemType.KK)
            {
                tovabbiMunkaugyiAdatokModel.FoglalkoztatasiJogviszony = (int)MunkaviszonyTipusEnum.kozalkalmazotti_jogviszony_hatarozatlan_idore;
            }

            var model = new PopUpModel(tovabbiMunkaugyiAdatokModel, "TovabbiMunkaugyiAdatok_PopUp");

            model.Buttons.Add(new ModalButtonModel() { Name = "BtnMunkaugyiAdatokCancel", Text = Resources.CommonResource.Megse, EventName = "TovabbiMunkaugyiAdatokHelper.newTovabbiMunkaugyiAdatokCancel" });
            model.Buttons.Add(new ModalButtonModel() { Name = "BtnMunkaugyiAdatokOk", Text = Resources.CommonResource.Mentes, EventName = "TovabbiMunkaugyiAdatokHelper.saveNewMunkaugyiAdatok" });

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

        public ActionResult OpenModifyTovabbiMunkaugyiAdatokPopUp(int id)
        {
            var apiController = new AlkalmazottApiController(_leltarClient);
            var tovabbiMunkaugyiAdatokModel = apiController.GetTovabbiMunkaugyiAdatok(id);

            var model = new PopUpModel(tovabbiMunkaugyiAdatokModel, "TovabbiMunkaugyiAdatok_PopUp");

            model.Buttons.Add(new ModalButtonModel() { Name = "BtnMunkaugyiAdatokCancel", Text = Resources.CommonResource.Megse, EventName = "TovabbiMunkaugyiAdatokHelper.modifyTovabbiMunkaugyiAdatokCancel" });
            model.Buttons.Add(new ModalButtonModel() { Name = "BtnMunkaugyiAdatokOk", Text = Resources.CommonResource.Mentes, EventName = "TovabbiMunkaugyiAdatokHelper.saveModMunkaugyiAdatok" });

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

        public ActionResult OpenInfoTovabbiMunkaugyiAdatokPopUp(int id)
        {
            var apiController = new AlkalmazottApiController(_leltarClient);
            var tovabbiMunkaugyiAdatokModel = apiController.GetTovabbiMunkaugyiAdatokAdataiForInfoWindow(id);

            var model = new PopUpModel(tovabbiMunkaugyiAdatokModel, "Info_TovabbiMunkaugyiAdatok_PopUp");

            model.Buttons.Add(new ModalButtonModel() { Name = "BtnMunkaugyiAdatokCancel", Text = Resources.CommonResource.Megse, EventName = "TovabbiMunkaugyiAdatokHelper.infoTovabbiMunkaugyiAdatokCancel" });

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

        public ActionResult OpenNewTovabbkepzesPopUp(int alkalmazottId)
        {
            var tovabbkepzesModel = new TovabbkepzesModel(alkalmazottId);

            var model = new PopUpModel(tovabbkepzesModel, "New_Tovabbkepzes_Popup");

            model.Buttons.Add(new ModalButtonModel() { Name = "BtnTovabbkepzesCancel", Text = Resources.CommonResource.Megse, EventName = "TovabbkepzesHelper.newTovabbkepzesCancel" });
            model.Buttons.Add(new ModalButtonModel() { Name = "BtnTovabbkepzesOk", Text = Resources.CommonResource.Mentes, EventName = "TovabbkepzesHelper.newTovabbkepzesSave" });

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

        public ActionResult OpenModifyTovabbkepzesPopUp(int tovabbkepzesId)
        {
            var tanarHelper = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            var tovabbkepzesCo = tanarHelper.GetTovabbkepzes(tovabbkepzesId);
            var tovabbkepzesModel = new TovabbkepzesModel(tovabbkepzesCo);

            var model = new PopUpModel(tovabbkepzesModel, "New_Tovabbkepzes_Popup");

            model.Buttons.Add(new ModalButtonModel() { Name = "BtnTovabbkepzesCancel", Text = Resources.CommonResource.Megse, EventName = "TovabbkepzesHelper.modifyTovabbkepzesCancel" });
            model.Buttons.Add(new ModalButtonModel() { Name = "BtnTovabbkepzesOk", Text = Resources.CommonResource.Mentes, EventName = "TovabbkepzesHelper.modifyTovabbkepzesSave" });

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

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public ActionResult GetSZIRBeallitasokPartialView(int id)
        {
            return base.GetSZIRBeallitasokPartialView(id);
        }

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public ActionResult GetElsodlegesMunkaugyiAdatokPartialView(int id)
        {
            return GetElsodlegesMunkaugyiAdatokPartialView(id, false);
        }

        public ActionResult OpenModPopUp(List<AlkalmazottModModel> alkalmazottList)
        {
            return OpenModPopUp(alkalmazottList, false);
        }

        #region Export

        public ActionResult ExportAlkalmazottakLakcimmel([FromUri] AlkalmazottSearchModel model)
        {
            return base.ExportAlkalmazottakLakcimmel(model);
        }

        public ActionResult ExportAlkalmazottakMunkaugyiAdatai([FromUri] AlkalmazottSearchModel model)
        {
            return base.ExportAlkalmazottakMunkaugyiAdatai(model);
        }

        public ActionResult ExportAlkalmazottakSzemelyiAdatai([FromUri] AlkalmazottSearchModel model)
        {
            return base.ExportAlkalmazottakSzemelyiAdatai(model);
        }

        #endregion

        public ActionResult OpenVegzettsegWizard(int alkalmazottId)
        {
            return base.OpenVegzettsegWizard(alkalmazottId);
        }

        public ActionResult OpenVegzettsegTipusWizard()
        {
            return base.OpenVegzettsegTipusWizard();
        }

        public ActionResult OpenTanarVegzettsegTipusWizard()
        {
            return base.OpenTanarVegzettsegTipusWizard();
        }

        public ActionResult OpenAMITanarVegzettsegTipusWizard()
        {
            return base.OpenAMITanarVegzettsegTipusWizard();
        }

        public ActionResult OpenTanitoVegzettsegTipusWizard()
        {
            return base.OpenTanitoVegzettsegTipusWizard();
        }

        public ActionResult OpenGyogyPedagogusVegzettsegTipusWizard()
        {
            return base.OpenGyogyPedagogusVegzettsegTipusWizard();
        }

        public ActionResult VegzettsegDetailGrid(AlkalmazottInfoModel.KKVegzettsegMainModel parentModel)
        {
            return base.VegzettsegDetailGrid(parentModel);
        }

        public ActionResult OpenModifyVegzettsegWizard(AlkalmazottInfoModel.KKVegzettsegMainModel parentModel)
        {
            return base.OpenModifyVegzettsegWizard(parentModel);
        }

        public ActionResult OpenFeladatellatasiHelyekPopUp()
        {
            return base.OpenFeladatellatasiHelyekPopUp();
        }

        [HttpPost]
        public ActionResult GetExportElerhetosegOsszesGrid(int id)
        {
            return base.GetExportElerhetosegOsszesGrid(id);
        }
    }
}