using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.ModelBinding;
using Kendo.Mvc.Extensions;
using Kendo.Mvc.UI;
using Kreta.BusinessLogic.HelperClasses;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Logic;
using Kreta.BusinessLogic.Security;
using Kreta.BusinessLogic.Validation;
using Kreta.Client.Leltar;
using Kreta.Core;
using Kreta.Core.Exceptions;
using Kreta.Core.FeatureToggle;
using Kreta.Enums;
using Kreta.Framework;
using Kreta.Framework.Entities;
using Kreta.Framework.Util;
using Kreta.Resources;
using Kreta.Web.Areas.Alkalmazott.ModelInterface;
using Kreta.Web.Areas.Alkalmazott.Models;
using Kreta.Web.Helpers;
using Kreta.Web.Helpers.Error;
using Kreta.Web.Helpers.Grid;
using Kreta.Web.Security;

namespace Kreta.Web.Areas.Alkalmazott.ApiControllers
{
    [ApiRoleClaimsAuthorize(true)]
    [ApiRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
    public class AlkalmazottApiController : BaseAlkalmazottApiController
    {
        public AlkalmazottApiController(ILeltarClient leltarClient)
            : base(leltarClient)
        {
        }

        public BetoltetlenAllashelyModel CreateNewBetoltetlenAllashelyModel()
        {
            var intezmenyCo = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetIntezmenyiAdatok();
            var elotag = "[" + AlkalmazottResource.BTA + " " + (new AlkalmazottHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetBetoltetlenAllashelyekSzama() + 1).ToString() + "]";
            var model = new BetoltetlenAllashelyModel()
            {
                NemList = Helpers.AlkalmazottViewHelper.GetNemList().Where(x => x.Value == 4.ToString() || x.Value == 5.ToString()).ToList(),
                //IgazolvanyTipus = (int?)Enums.IgazolvanyTipusEnum.Szemelyi_igazolvany,
                NevEloTag = elotag,                
                MunkavallaloCsaladiNev = AlkalmazottResource.Betoltetlen,
                SzuletesiCsaladiNev = AlkalmazottResource.Betoltetlen,
                AnyjaCsaladiNeve = AlkalmazottResource.Betoltetlen,

                MunkavallaloUtonev = AlkalmazottResource.Allashely,
                SzuletesiUtonev = AlkalmazottResource.Allashely,
                AnyjaUtoneve = elotag,

                SzuletesiIdo = new DateTime(1950, 01, 01),
                SzuletesiHely = AlkalmazottResource.Ismeretlen,
                Nem = (int)NemEnum.Ferfi,

                Cim = AlkalmazottResource.Ismeretlen,
                Iranyitoszam = intezmenyCo.Iranyitoszam,
                Varos = intezmenyCo.Varos,

                KotelezoOraszam = 22,
                MunkaKor = (int)MunkakorTipusEnum.na,
                FoglalkoztatasiJogviszony = (int)MunkaviszonyTipusEnum.na,
                BetoltetlenAllashely = true
            };
            return model;
        }

        public HitoktatoModel CreateNewHitoktatoModel()
        {
            var intezmenyCo = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetIntezmenyiAdatok();
            var elotag = new AlkalmazottHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetSpecialisAlkalmazottakNevEloTag(AlkalmazottResource.HitoktatoRovid);
            var model = new HitoktatoModel()
            {
                NemList = Helpers.AlkalmazottViewHelper.GetNemList().Where(x => x.Value == 4.ToString() || x.Value == 5.ToString()).ToList(),
                //IgazolvanyTipus = (int?)Enums.IgazolvanyTipusEnum.Szemelyi_igazolvany,
                NevEloTag = elotag,
                MunkavallaloCsaladiNev = AlkalmazottResource.Hittan,
                SzuletesiCsaladiNev = AlkalmazottResource.Hittan,
                AnyjaCsaladiNeve = AlkalmazottResource.Hittan,

                MunkavallaloUtonev = AlkalmazottResource.Oktato,
                SzuletesiUtonev = AlkalmazottResource.Oktato,
                AnyjaUtoneve = elotag,

                SzuletesiIdo = new DateTime(1950, 01, 01),
                SzuletesiHely = AlkalmazottResource.Ismeretlen,
                Nem = (int)Enums.NemEnum.Ferfi,

                Cim = AlkalmazottResource.Ismeretlen,
                Iranyitoszam = intezmenyCo.Iranyitoszam,
                Varos = intezmenyCo.Varos,

                KotelezoOraszam = 22,
                MunkaKor = (int)Enums.MunkakorTipusEnum.Hittanoktato,
                FoglalkoztatasiJogviszony = (int)Enums.MunkaviszonyTipusEnum.na
            };
            return model;
        }

        public KulsosAlkalmazottModel CreateNewKulsosAlkalmazottModel()
        {
            var intezmenyCo = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetIntezmenyiAdatok();
            var elotag = new AlkalmazottHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetSpecialisAlkalmazottakNevEloTag(AlkalmazottResource.KulsosRovid);
            var model = new KulsosAlkalmazottModel()
            {
                NemList = Helpers.AlkalmazottViewHelper.GetNemList().Where(x => x.Value == 4.ToString() || x.Value == 5.ToString()).ToList(),
                NevEloTag = elotag,
                MunkavallaloCsaladiNev = AlkalmazottResource.KulsosCsaladNev,
                SzuletesiCsaladiNev = AlkalmazottResource.KulsosCsaladNev,
                AnyjaCsaladiNeve = AlkalmazottResource.KulsosCsaladNev,

                MunkavallaloUtonev = AlkalmazottResource.KulsosUtoNev,
                SzuletesiUtonev = AlkalmazottResource.KulsosUtoNev,
                AnyjaUtoneve = elotag,

                SzuletesiIdo = new DateTime(1950, 01, 01),
                SzuletesiHely = AlkalmazottResource.Ismeretlen,
                Nem = (int)NemEnum.Ferfi,

                Cim = AlkalmazottResource.Ismeretlen,
                Iranyitoszam = intezmenyCo.Iranyitoszam,
                Varos = intezmenyCo.Varos,

                KotelezoOraszam = 22,
                MunkaKor = (int)MunkakorTipusEnum.na,
                FoglalkoztatasiJogviszony = (int)MunkaviszonyTipusEnum.na
            };
            return model;
        }

        public KulsoGyakorlatiAllashelyModel CreateNewKulsoGyakorlatiAllashelyModel()
        {
            var intezmenyCo = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetIntezmenyiAdatok();
            var elotag = new AlkalmazottHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetSpecialisAlkalmazottakNevEloTag(AlkalmazottResource.KulsoGyakorlatiRovid);
            var model = new KulsoGyakorlatiAllashelyModel()
            {
                NemList = Helpers.AlkalmazottViewHelper.GetNemList().Where(x => x.Value == 4.ToString() || x.Value == 5.ToString()).ToList(),
                NevEloTag = elotag,
                MunkavallaloCsaladiNev = AlkalmazottResource.KulsoGyakorlatiCsaladNev,
                SzuletesiCsaladiNev = AlkalmazottResource.KulsoGyakorlatiCsaladNev,
                AnyjaCsaladiNeve = AlkalmazottResource.KulsoGyakorlatiCsaladNev,

                MunkavallaloUtonev = AlkalmazottResource.KulsoGyakorlatiUtoNev,
                SzuletesiUtonev = AlkalmazottResource.KulsoGyakorlatiUtoNev,
                AnyjaUtoneve = elotag,

                SzuletesiIdo = new DateTime(1950, 01, 01),
                SzuletesiHely = AlkalmazottResource.Ismeretlen,
                Nem = (int)NemEnum.Ferfi,

                Cim = AlkalmazottResource.Ismeretlen,
                Iranyitoszam = intezmenyCo.Iranyitoszam,
                Varos = intezmenyCo.Varos,

                KotelezoOraszam = 22,
                MunkaKor = (int)MunkakorTipusEnum.KulsoGyakorlatiHely,
                FoglalkoztatasiJogviszony = (int)MunkaviszonyTipusEnum.na,
            };

            return model;
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveBetoltetlenAllashely(BetoltetlenAllashelyModel model)
        {
            AlterAlkalmazottCustomValidation(model);
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            var co = new TanarAdatCO()
            {
                Nem = model.Nem,
                NevElotag = model.NevEloTag,
                Elotag = model.NevEloTag,
                SzuletesiNevElotag = model.NevEloTag,
                SzuletesiCsaladiNev = model.SzuletesiCsaladiNev,
                SzuletesiUtonev = model.SzuletesiUtonev,
                AnyjaCsaladiNeve = model.AnyjaCsaladiNeve,
                AnyjaUtoneve = model.NevEloTag,
                MunkavallaloCsaladiNev = model.MunkavallaloCsaladiNev,
                MunkavallaloUtonev = model.MunkavallaloUtonev,
                FeladatellatasiHely = model.FeladatellatasiHely.Value,
                Oraszam = model.KotelezoOraszam,
                SzuletesiHely = model.SzuletesiHely,
                SzuletesiIdo = model.SzuletesiIdo.Value,
                MunkaKor = model.MunkaKor,
                //SzabadAllashely = model.SzabadAllashely,
                FoglalkoztatasiJogviszony = model.FoglalkoztatasiJogviszony,
                BetoltetlenAllashely = model.BetoltetlenAllashely,
                Iranyitoszam = model.Iranyitoszam,
                HelysegNeve = model.Varos,
                KozteruletNeve = model.Cim,
                Hazszam = "1",
                VezetoiOraszamOka = (int)VezetoiOraszamokTipusEnum.Nincs
            };

            var h = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            h.AddOrUpdateTeacher(_leltarClient, co, update: false, isSzirIntezmeny: ClaimData.IsSzirIntezmeny, ClaimData.IsActivTanev);

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public PedagogusEletpalyamodellModel GetPedagogusEletpalyamodell(int id)
        {
            var helper = new TanarHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());

            var tanarEletpalyaModellCO = helper.GetPedagogusEletpalyaModellAdatai(id);
            var model = Helpers.AlkalmazottViewHelper.ConvertCOToModel(tanarEletpalyaModellCO);

            return model;
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public VegzettsegModel GetVegzettsegek(int id)
        {
            var helper = new TanarHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());

            var tanarVegzettsegekCO = helper.GetVegzettsegekModelAdatai(id);
            var model = Helpers.AlkalmazottViewHelper.ConvertCOToModel(tanarVegzettsegekCO);

            return model;
        }

        public TovabbiMunkaugyiAdatokModel GetTovabbiMunkaugyiAdatok(int id)
        {
            var tovabbiMunkaugyiAdatokCO = new AlkalmazottHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetTovabbiMunkaugyiAdatokAdatai(id);
            var model = Helpers.AlkalmazottViewHelper.ConvertCOToModel(tovabbiMunkaugyiAdatokCO);

            return model;
        }

        public InfoTovabbiMunkaugyiAdatokPopUpModel GetTovabbiMunkaugyiAdatokAdataiForInfoWindow(int id)
        {
            var infoTovabbiMunkaugyiAdatokPopUpCO = new AlkalmazottHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetTovabbiMunkaugyiAdatokAdataiForInfoWindow(id);
            var model = Helpers.AlkalmazottViewHelper.ConvertCOToModel(infoTovabbiMunkaugyiAdatokPopUpCO);

            return model;
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SavePedagogusEletpalyamodell(PedagogusEletpalyamodellModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var helper = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                    var tanarEletpalyaModellCO = Helpers.AlkalmazottViewHelper.ConvertModelToCO(model);
                    helper.CreateOrUpdateEletpalyaModell(tanarEletpalyaModellCO);

                    return new HttpResponseMessage(HttpStatusCode.OK);
                }

                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
            catch (BlException e)
            {
                var error = new StatusError(HttpStatusCode.BadRequest, e.Message);
                throw error;
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeletePedagogusEletpalyamodell([FromBody] int Id)
        {
            try
            {
                new AlkalmazottHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).DeleteEletpalyaModell(Id);
                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (EntityDeleteFailedException)
            {
                throw new StatusError(HttpStatusCode.BadRequest,
                    string.Format(StringResourcesUtil.GetString(5490),
                        StringResourcesUtil.GetString(3495)/*,
                        e.ConnectionErrorMessage*/)
                        /*A(z) alkalmazott nem törölhető, mert egy vagy több kapcsolódása van (kapcsolatok: {1})!*/);
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveVegzettseg(VegzettsegModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var helper = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                    var tanarVegzettsegCO = Helpers.AlkalmazottViewHelper.ConvertModelToCO(model);
                    helper.CreateOrUpdateVegzettseg(tanarVegzettsegCO);

                    return new HttpResponseMessage(HttpStatusCode.OK);
                }

                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
            catch (BlException e)
            {
                var error = new StatusError(HttpStatusCode.BadRequest, e.Message);
                throw error;
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteVegzettseg([FromBody] int Id)
        {
            try
            {
                new AlkalmazottHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).DeleteVegzettseg(Id);
                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (EntityDeleteFailedException)
            {
                throw new StatusError(HttpStatusCode.BadRequest,
                    string.Format(StringResourcesUtil.GetString(5490),
                        StringResourcesUtil.GetString(3495)/*,
                        e.ConnectionErrorMessage*/)
                        /*A(z) alkalmazott nem törölhető, mert egy vagy több kapcsolódása van (kapcsolatok: {1})!*/);
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteTovabbiMunkaugyiAdatok([FromBody] int Id)
        {
            try
            {
                new AlkalmazottHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).DeleteTovabbiMunkaugyiAdatok(Id);
                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (EntityDeleteFailedException)
            {
                throw new StatusError(HttpStatusCode.BadRequest,
                    string.Format(StringResourcesUtil.GetString(5490),
                        StringResourcesUtil.GetString(3495)/*,
                        e.ConnectionErrorMessage*/)
                        /*A(z) alkalmazott nem törölhető, mert egy vagy több kapcsolódása van (kapcsolatok: {1})!*/);
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveTovabbiMunkaugyiAdatok(TovabbiMunkaugyiAdatokModel model)
        {
            try
            {
                if (!model.VezetoiOraszamOka.IsEntityId())
                {
                    var isNszfhUjSzkt = ClaimData.IsSelectedTanev20_21OrLater && ClaimData.IsSzakkepzoIntezmeny;
                    ModelState.AddModelError(nameof(model.VezetoiOraszamOka), isNszfhUjSzkt ? ErrorResource.VezetoiMegbizasMegadasaKotelezo : ErrorResource.VezetoiOraszamOkaMegadasaKotelezo);
                }

                if (ModelState.IsValid)
                {
                    var featureContext = (IFeatureContext)Request.GetDependencyScope().GetService(typeof(IFeatureContext));
                    var isKlebelsbergKozpontOrNSZFH =
                        featureContext.IsEnabled(Core.Constants.FeatureName.MunkaugyiAdatokKlebelsberg)
                        || featureContext.IsEnabled(Core.Constants.FeatureName.MunkaugyiAdatokNSZFH);

                    var tovabbiMunkaugyiAdatokCO = Helpers.AlkalmazottViewHelper.ConvertModelToCO(model);

                    var isNszfhUjSzkt = ClaimData.IsSelectedTanev20_21OrLater && ClaimData.IsSzakkepzoIntezmeny;

                    var helper = new AlkalmazottHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                    helper.CreateOrUpdateTovabbiMunkaugyiAdatok(tovabbiMunkaugyiAdatokCO, isKlebelsbergKozpontOrNSZFH, isNszfhUjSzkt);

                    return new HttpResponseMessage(HttpStatusCode.OK);
                }

                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
            catch (BlException e)
            {
                var error = new StatusError(HttpStatusCode.BadRequest, e.Message);
                throw error;
            }
        }

        #region Pedagógus életpályamodell tab
        [ApiRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public DataSourceResult GetPedagogusEletpalyamodellGrid(int id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var (gridParameter, modelList, alkalmazottNev) = GetPedagogusEletpalyamodellGridData(id, request);

            return modelList.ToDataSourceResult(gridParameter);
        }

        public HttpResponseMessage GetExportPedagogusEletpalyamodellGrid(int id, DataSourceRequest request)
        {
            try
            {
                var (gridParameter, modelList, alkalmazottNev) = GetPedagogusEletpalyamodellGridData(id, request);

                return GetPedagogusEletpalyamodellExportFile(gridParameter, modelList, AdatszolgaltatasokResource.PedagogusEletpalyamodellExportSheetName, $"{alkalmazottNev}_{AdatszolgaltatasokResource.PedagogusEletpalyamodellExportFileName}_{DateTime.Now:yyyy_MM_dd}.{Constants.ImportExport.FileFormatXlsx}", ClaimData.SelectedTanevID.Value);
            }
            catch (Exception ex)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.HibaTortentAFajlExportalasaKozben) { UnHandledException = ex };
            }
        }

        private HttpResponseMessage GetPedagogusEletpalyamodellExportFile(GridParameters gridParameter, List<AlkalmazottInfoModel.PedagogusEletpalyamodellModel> modelList, string worksheetName, string fileName, int tanevId)
        {
            var orderedList = modelList.SortingAndPaging(gridParameter.OrderDictionary);

            var simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos<AlkalmazottInfoModel.PedagogusEletpalyamodellModel>(AlkalmazottInfoModel.PedagogusEletpalyamodellModel.PedagogusEletpalyamodellExportAttributeId);

            var memoryStream = SimpleExportLogic.GetExport(worksheetName, simpleExportColumnCos, orderedList, tanevId);

            return HttpResponseExtensions.GetFileHttpResponse(memoryStream.ToArray(), fileName);
        }

        private (GridParameters gridParameter, List<AlkalmazottInfoModel.PedagogusEletpalyamodellModel> modelList, string alkalmazottNev) GetPedagogusEletpalyamodellGridData(int id, DataSourceRequest request)
        {
            var gridParameter = Converter.GridParameter(request);

            var helper = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var coList = helper.GetPedagogusEletpalyamodellCoList(id);

            var modelList = new List<AlkalmazottInfoModel.PedagogusEletpalyamodellModel>();

            foreach (var co in coList)
            {
                var gridModel = new AlkalmazottInfoModel.PedagogusEletpalyamodellModel(co);
                modelList.Add(gridModel);
            }

            return (gridParameter, modelList, helper.GetTanarAdatok(id).NyomtatasiNev);
        }
        #endregion

        #region Végzettség tab
        [ApiRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public DataSourceResult GetVegzettsegGrid(int id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var (gridParameter, modelList, alkalmazottNev) = GetVegzettsegGridData(id, request);

            return modelList.ToDataSourceResult(gridParameter);
        }

        public HttpResponseMessage GetExportVegzettsegGrid(int id, DataSourceRequest request)
        {
            try
            {
                var (gridParameter, modelList, alkalmazottNev) = GetVegzettsegGridData(id, request);

                return GetVegzettsegExportFile(gridParameter, modelList, AdatszolgaltatasokResource.VegzettsegExportSheetName, $"{alkalmazottNev}_{AdatszolgaltatasokResource.VegzettsegExportFileName}_{DateTime.Now:yyyy_MM_dd}.{Constants.ImportExport.FileFormatXlsx}", ClaimData.SelectedTanevID.Value);
            }
            catch (Exception ex)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.HibaTortentAFajlExportalasaKozben) { UnHandledException = ex };
            }
        }

        private HttpResponseMessage GetVegzettsegExportFile(GridParameters gridParameter, List<AlkalmazottInfoModel.VegzettsegModel> modelList, string worksheetName, string fileName, int tanevId)
        {
            var orderedList = modelList.SortingAndPaging(gridParameter.OrderDictionary);

            var simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos<AlkalmazottInfoModel.VegzettsegModel>(AlkalmazottInfoModel.VegzettsegModel.VegzettsegExportAttributeId);

            var memoryStream = SimpleExportLogic.GetExport(worksheetName, simpleExportColumnCos, orderedList, tanevId);

            return HttpResponseExtensions.GetFileHttpResponse(memoryStream.ToArray(), fileName);
        }

        private (GridParameters gridParameter, List<AlkalmazottInfoModel.VegzettsegModel> modelList, string alkalmazottNev) GetVegzettsegGridData(int id, DataSourceRequest request)
        {
            var gridParameter = Converter.GridParameter(request);

            var helper = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var coList = helper.GetVegzettsegCoLst(id);

            var modelList = new List<AlkalmazottInfoModel.VegzettsegModel>();

            foreach (var co in coList)
            {
                var gridModel = new AlkalmazottInfoModel.VegzettsegModel(co);
                modelList.Add(gridModel);
            }

            return (gridParameter, modelList, helper.GetTanarAdatok(id).NyomtatasiNev);
        }
        #endregion

        [ApiRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public DataSourceResult GetKKVegzettsegMainGrid(int id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new VegzettsegHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);
            var ds = helper.GetKKMainGridVegzettsegek(id);

            return ds.ToDataSourceResult();
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public DataSourceResult GetKKVegzettsegDetailGrid(int id, KKKepesitesJellTipusEnum? tipus, int alkalmazottId, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new VegzettsegHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            if (tipus == KKKepesitesJellTipusEnum.Tanar)
            {
                helper.GridParameters = Converter.GridParameter(request);
                var tanarDs = helper.GetKKTanarTerulet(id);
                return tanarDs.ToDataSourceResult();
            }
            if (tipus == KKKepesitesJellTipusEnum.TanarAMI)
            {
                helper.GridParameters = Converter.GridParameter(request);
                var tanarDs = helper.GetKKAmiTanarTerulet(id);
                return tanarDs.ToDataSourceResult();
            }
            if (tipus == KKKepesitesJellTipusEnum.Tanito)
            {
                helper.GridParameters = Converter.GridParameter(request);
                var tanarDs = helper.GetKKTanitoTerulet(alkalmazottId);
                return tanarDs.ToDataSourceResult();
            }
            if (tipus == KKKepesitesJellTipusEnum.Gyogypedagogus)
            {
                helper.GridParameters = Converter.GridParameter(request);
                var tanarDs = helper.GetKKGyogypedTerulet(alkalmazottId);
                return tanarDs.ToDataSourceResult();
            }

            helper.GridParameters = Converter.GridParameter(request);
            var ds = helper.GetKKKepesitesTerulet();
            return ds.ToDataSourceResult();
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public DataSourceResult GetTovabbiMunkaugyiAdatokGrid(int id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new AlkalmazottHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);
            var ds = helper.GetTovabbiMunkaugyiAdatokGrid(id);

            return ds.ToDataSourceResult();
        }

        #region Eszköz tab
        [ApiRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public DataSourceResult GetEszkozGrid(int id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var (gridParameter, modelList, alkalmazottNev) = GetEszkozGridData(id, request);

            return modelList.ToDataSourceResult(gridParameter);
        }

        public HttpResponseMessage GetExportEszkozGrid(int id, DataSourceRequest request)
        {
            try
            {
                var (gridParameter, modelList, alkalmazottNev) = GetEszkozGridData(id, request);

                return GetEszkozExportFile(gridParameter, modelList, AdatszolgaltatasokResource.EszkozExportSheetName, $"{alkalmazottNev}_{AdatszolgaltatasokResource.EszkozExportFileName}_{DateTime.Now:yyyy_MM_dd}.{Constants.ImportExport.FileFormatXlsx}", ClaimData.SelectedTanevID.Value);
            }
            catch (Exception ex)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.HibaTortentAFajlExportalasaKozben) { UnHandledException = ex };
            }
        }

        private HttpResponseMessage GetEszkozExportFile(GridParameters gridParameter, List<AlkalmazottInfoModel.EszkozModel> modelList, string worksheetName, string fileName, int tanevId)
        {
            var orderedList = modelList.SortingAndPaging(gridParameter.OrderDictionary);

            var simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos<AlkalmazottInfoModel.EszkozModel>(AlkalmazottInfoModel.EszkozModel.EszkozExportAttributeId);

            var memoryStream = SimpleExportLogic.GetExport(worksheetName, simpleExportColumnCos, orderedList, tanevId);

            return HttpResponseExtensions.GetFileHttpResponse(memoryStream.ToArray(), fileName);
        }

        private (GridParameters gridParameter, List<AlkalmazottInfoModel.EszkozModel> modelList, string alkalmazottNev) GetEszkozGridData(int id, DataSourceRequest request)
        {
            var gridParameter = Converter.GridParameter(request);

            var helper = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var coList = helper.GetEszkozokCoList(id);

            var modelList = new List<AlkalmazottInfoModel.EszkozModel>();

            foreach (var co in coList)
            {
                var gridModel = new AlkalmazottInfoModel.EszkozModel(co);
                modelList.Add(gridModel);
            }

            return (gridParameter, modelList, helper.GetTanarAdatok(id).NyomtatasiNev);
        }
        #endregion

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveAMITanarVegzettseg(AMITanarVegzettsegWizardModel model)
        {
            var blValidator = new BlValidator(model);
            if (!blValidator.IsValid)
            {
                foreach (var item in blValidator.ErrorList)
                {
                    ModelState.AddModelError("Error", item.ErrorMessage);
                }
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            var helper = new VegzettsegHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            if (model.EntityId.HasValue)
            {
                helper.UpdateAMITanarVegzettseg(model.ToCo(), ClaimData.KovTanevID);
            }
            else
            {
                helper.SaveAMITanarVegzettseg(model.ToCo(), ClaimData.KovTanevID);
            }

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveTanitoVegzettseg(TanitoVegzettsegWizardModel model)
        {
            new VegzettsegHelper(ConnectionTypeExtensions.GetSessionConnectionType()).SaveTanitoVegzettseg(model.ToCo(), ClaimData.KovTanevID);

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveGyogypedagogusVegzettseg(GyogyPedagogusVegzettsegWizardModel model)
        {
            new VegzettsegHelper(ConnectionTypeExtensions.GetSessionConnectionType()).SaveGyogypedagogusVegzettseg(model.ToCo(), ClaimData.KovTanevID);

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage UpdateTanitoVegzettseg(TanitoVegzettsegWizardModel model)
        {
            new VegzettsegHelper(ConnectionTypeExtensions.GetSessionConnectionType()).UpdateTanitoVegzettseg(model.ToCo(), ClaimData.KovTanevID);

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage UpdateGyogypedagogusVegzettseg(GyogyPedagogusVegzettsegWizardModel model)
        {
            new VegzettsegHelper(ConnectionTypeExtensions.GetSessionConnectionType()).UpdateGyogypedagogusVegzettseg(model.ToCo(), ClaimData.KovTanevID);

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteKepesites(AlkalmazottInfoModel.KKVegzettsegMainModel row)
        {
            var helper = new VegzettsegHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            if (row.KepesitesTipusId == null)
            {
                helper.DeleteKepesites(row.AlkalmazottId, ClaimData.KovTanevID);
                return new HttpResponseMessage(HttpStatusCode.OK);
            }

            if (row.KepesitesTipusId == (int)KKKepesitesJellTipusEnum.Tanar)
            {
                helper.DeleteTanarVegzettseg(row.EntityID.Value, row.AlkalmazottId, ClaimData.KovTanevID);
                return new HttpResponseMessage(HttpStatusCode.OK);
            }

            if (row.KepesitesTipusId == (int)KKKepesitesJellTipusEnum.TanarAMI)
            {
                helper.DeleteAMITanarVegzettseg(row.EntityID.Value, row.AlkalmazottId, ClaimData.KovTanevID);
                return new HttpResponseMessage(HttpStatusCode.OK);
            }

            if (row.KepesitesTipusId == (int)KKKepesitesJellTipusEnum.Tanito)
            {
                helper.DeleteTanitoVegzettseg(row.AlkalmazottId, ClaimData.KovTanevID);
                return new HttpResponseMessage(HttpStatusCode.OK);
            }

            if (row.KepesitesTipusId == (int)KKKepesitesJellTipusEnum.Gyogypedagogus)
            {
                helper.DeleteGyogypedagogusVegzettseg(row.AlkalmazottId, ClaimData.KovTanevID);
                return new HttpResponseMessage(HttpStatusCode.OK);
            }

            return new HttpResponseMessage(HttpStatusCode.BadRequest);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveKulsosAlkalmazott(KulsosAlkalmazottModel model)
        {
            AlterAlkalmazottCustomValidation(model);
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            var co = new TanarAdatCO()
            {
                Nem = model.Nem,
                NevElotag = model.NevEloTag,
                Elotag = model.NevEloTag,
                SzuletesiNevElotag = model.NevEloTag,
                SzuletesiCsaladiNev = model.SzuletesiCsaladiNev,
                SzuletesiUtonev = model.SzuletesiUtonev,
                AnyjaCsaladiNeve = model.AnyjaCsaladiNeve,
                AnyjaUtoneve = model.NevEloTag,
                MunkavallaloCsaladiNev = model.MunkavallaloCsaladiNev,
                MunkavallaloUtonev = model.MunkavallaloUtonev,
                FeladatellatasiHely = model.FeladatellatasiHely.Value,
                Oraszam = model.KotelezoOraszam,
                SzuletesiHely = model.SzuletesiHely,
                SzuletesiIdo = model.SzuletesiIdo.Value,
                MunkaKor = model.MunkaKor,
                FoglalkoztatasiJogviszony = model.FoglalkoztatasiJogviszony,
                BetoltetlenAllashely = model.BetoltetlenAllashely,
                Iranyitoszam = model.Iranyitoszam,
                HelysegNeve = model.Varos,
                KozteruletNeve = model.Cim,
                Hazszam = "1",
                VezetoiOraszamOka = (int)VezetoiOraszamokTipusEnum.Nincs,
                IsKulsoAlkalmazott = true,
                BelepesiNev = model.BelepesiNev,
                Jelszo = model.Jelszo,
                Email = model.EmailCim,
                EmailTipus = model.EmailTipus,
                Telefon = model.Telefon,
                TelefonTipus = model.TelefonTipus
            };

            var h = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            h.AddOrUpdateTeacher(_leltarClient, co, update: false, isSzirIntezmeny: ClaimData.IsSzirIntezmeny, ClaimData.IsActivTanev);

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveKulsoGyakorlatiAllashely(KulsoGyakorlatiAllashelyModel model)
        {
            AlterAlkalmazottCustomValidation(model);
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            var co = new TanarAdatCO()
            {
                Nem = model.Nem,
                NevElotag = model.NevEloTag,
                Elotag = model.NevEloTag,
                SzuletesiNevElotag = model.NevEloTag,
                SzuletesiCsaladiNev = model.SzuletesiCsaladiNev,
                SzuletesiUtonev = model.SzuletesiUtonev,
                AnyjaCsaladiNeve = model.AnyjaCsaladiNeve,
                AnyjaUtoneve = model.NevEloTag,
                MunkavallaloCsaladiNev = model.MunkavallaloCsaladiNev,
                MunkavallaloUtonev = model.MunkavallaloUtonev,
                FeladatellatasiHely = model.FeladatellatasiHely.Value,
                Oraszam = model.KotelezoOraszam,
                SzuletesiHely = model.SzuletesiHely,
                SzuletesiIdo = model.SzuletesiIdo.Value,
                MunkaKor = model.MunkaKor,
                FoglalkoztatasiJogviszony = model.FoglalkoztatasiJogviszony,
                BetoltetlenAllashely = model.BetoltetlenAllashely,
                Iranyitoszam = model.Iranyitoszam,
                HelysegNeve = model.Varos,
                KozteruletNeve = model.Cim,
                Hazszam = "1",
                VezetoiOraszamOka = (int)VezetoiOraszamokTipusEnum.Nincs,
            };

            var h = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            h.AddOrUpdateTeacher(_leltarClient, co, update: false, isSzirIntezmeny: ClaimData.IsSzirIntezmeny, ClaimData.IsActivTanev);

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveDualisKepzohelyiOktato(DualisKepzohelyiOktatoModel model)
        {
            return SaveDualisKepzohelyiOktato(model, false);
        }

        #region Továbbképzés tab
        [ApiRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.IsCsokkentettAdminJog.ClaimValue)]
        public DataSourceResult GetTovabbkepzesGrid(int id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var (gridParameter, modelList, alkalmazottNev) = GetTovabbkepzesGridData(id, request);

            return modelList.ToDataSourceResult(gridParameter);
        }

        public HttpResponseMessage GetExportTovabbkepzesGrid(int id, DataSourceRequest request)
        {
            try
            {
                var (gridParameter, modelList, alkalmazottNev) = GetTovabbkepzesGridData(id, request);

                return GetTovabbkepzesExportFile(gridParameter, modelList, AdatszolgaltatasokResource.TovabbkepzesExportSheetName, $"{alkalmazottNev}_{AdatszolgaltatasokResource.TovabbkepzesExportFileName}_{DateTime.Now:yyyy_MM_dd}.{Constants.ImportExport.FileFormatXlsx}", ClaimData.SelectedTanevID.Value);
            }
            catch (Exception ex)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.HibaTortentAFajlExportalasaKozben) { UnHandledException = ex };
            }
        }

        private HttpResponseMessage GetTovabbkepzesExportFile(GridParameters gridParameter, List<AlkalmazottInfoModel.TovabbkepzesModel> modelList, string worksheetName, string fileName, int tanevId)
        {
            var orderedList = modelList.SortingAndPaging(gridParameter.OrderDictionary);

            var simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos<AlkalmazottInfoModel.TovabbkepzesModel>(AlkalmazottInfoModel.TovabbkepzesModel.TovabbkepzesExportAttributeId);

            var memoryStream = SimpleExportLogic.GetExport(worksheetName, simpleExportColumnCos, orderedList, tanevId);

            return HttpResponseExtensions.GetFileHttpResponse(memoryStream.ToArray(), fileName);
        }

        private (GridParameters gridParameter, List<AlkalmazottInfoModel.TovabbkepzesModel> modelList, string alkalmazottNev) GetTovabbkepzesGridData(int id, DataSourceRequest request)
        {
            var gridParameter = Converter.GridParameter(request);

            var helper = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var coList = helper.GetAlkalmazottTovabbkepzesek(id);

            var modelList = new List<AlkalmazottInfoModel.TovabbkepzesModel>();

            foreach (var co in coList)
            {
                var gridModel = new AlkalmazottInfoModel.TovabbkepzesModel(co);
                modelList.Add(gridModel);
            }

            return (gridParameter, modelList, helper.GetTanarAdatok(id).NyomtatasiNev);
        }
        #endregion

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveTovabbkepzes(TovabbkepzesModel model)
        {
            try
            {
                if (!ValidateTovabbkepzesModel(model, out var errorDictionary))
                {
                    ModelState.AddRange(errorDictionary);
                }

                if (ModelState.IsValid)
                {
                    var tanarHelper = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                    tanarHelper.SaveTovabbkepzes(model.ConvertModelToCo());

                    return new HttpResponseMessage(HttpStatusCode.OK);
                }

                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
            catch (BlException e)
            {
                throw new StatusError(HttpStatusCode.BadRequest, e.Message);
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteTovabbkepzes([FromBody] int id)
        {
            try
            {
                var tanarHelper = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                tanarHelper.DeleteTovabbkepzes(id);

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (EntityDeleteFailedException)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.AzElemNemTorolheto);
            }
        }

        private bool ValidateTovabbkepzesModel(TovabbkepzesModel model, out Dictionary<string, string> errorDictionary)
        {
            errorDictionary = new Dictionary<string, string>();

            //NOTE: Ha valamelyik mező ki van töltve, akkor valid a model.
            var isValid = !string.IsNullOrWhiteSpace(model.TovabbkepzesMegnevezese) || !string.IsNullOrWhiteSpace(model.EngedelySzama)
                || !string.IsNullOrWhiteSpace(model.Helyszin) || model.Datum.HasValue || model.Oraszam.HasValue
                || !string.IsNullOrWhiteSpace(model.TanusitvanySorszama);

            if (!isValid)
            {
                errorDictionary.Add("Error", ErrorResource.LegalabbEgyMezoKitolteseKotelezo);
            }

            return isValid;
        }

        private void AlterAlkalmazottCustomValidation(IAlterAlkalmazottValidationModel model)
        {
            var alkalmazottHelper = new AlkalmazottHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            if (alkalmazottHelper.IsTeljesNevTulHosszu(model.MunkavallaloCsaladiNev + model.MunkavallaloUtonev))
            {
                ModelState.AddModelError("AlapAdatModel.MunkavallaloCsaladiNev", AlkalmazottResource.ACsaladiEsUtonevEgyuttNemLehetHosszabb61Karakternel);
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveHitoktato(HitoktatoModel model)
        {
            AlterAlkalmazottCustomValidation(model);
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            var co = new TanarAdatCO()
            {
                Nem = model.Nem,
                NevElotag = model.NevEloTag,
                Elotag = model.NevEloTag,
                SzuletesiNevElotag = model.NevEloTag,
                SzuletesiCsaladiNev = model.SzuletesiCsaladiNev,
                SzuletesiUtonev = model.SzuletesiUtonev,
                AnyjaCsaladiNeve = model.AnyjaCsaladiNeve,
                AnyjaUtoneve = model.NevEloTag,
                MunkavallaloCsaladiNev = model.MunkavallaloCsaladiNev,
                MunkavallaloUtonev = model.MunkavallaloUtonev,
                FeladatellatasiHely = model.FeladatellatasiHely.Value,
                Oraszam = model.KotelezoOraszam,
                SzuletesiHely = model.SzuletesiHely,
                SzuletesiIdo = model.SzuletesiIdo.Value,
                MunkaKor = model.MunkaKor,
                FoglalkoztatasiJogviszony = model.FoglalkoztatasiJogviszony,
                BetoltetlenAllashely = model.BetoltetlenAllashely,
                Iranyitoszam = model.Iranyitoszam,
                HelysegNeve = model.Varos,
                KozteruletNeve = model.Cim,
                Hazszam = "1",
                VezetoiOraszamOka = (int)VezetoiOraszamokTipusEnum.Nincs
            };

            var h = new TanarHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            h.AddOrUpdateTeacher(_leltarClient, co, update: false, isSzirIntezmeny: ClaimData.IsSzirIntezmeny, ClaimData.IsActivTanev);

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveKepesitesNelkuli(VegzettsegWizardBaseModel model)
        {
            new VegzettsegHelper(ConnectionTypeExtensions.GetSessionConnectionType()).SaveKepesitesNelkuli(model.ToCo(), ClaimData.KovTanevID);

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveTanarVegzettseg(TanarVegzettsegWizardModel model)
        {
            var helper = new VegzettsegHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            if (model.EntityId.HasValue)
            {
                helper.UpdateTanarVegzettseg(model.ToCo(), ClaimData.KovTanevID);
            }
            else
            {
                helper.SaveTanarVegzettseg(model.ToCo(), ClaimData.KovTanevID);
            }

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

    }
}