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.Caching;
using Kreta.BusinessLogic.Classes;
using Kreta.BusinessLogic.Exceptions;
using Kreta.BusinessLogic.HelperClasses;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Helpers.SystemSettings;
using Kreta.BusinessLogic.Logic.SystemSettings;
using Kreta.BusinessLogic.Security;
using Kreta.Core.ConnectionType;
using Kreta.Enums;
using Kreta.Framework;
using Kreta.Framework.Caching.DictionaryItemTables;
using Kreta.Resources;
using Kreta.Web.Areas.Adminisztracio.Models;
using Kreta.Web.Helpers;
using Kreta.Web.Helpers.Error;
using Kreta.Web.Helpers.Grid;
using Kreta.Web.Security;
using Newtonsoft.Json;
using ModelStateDictionary = System.Web.Http.ModelBinding.ModelStateDictionary;

namespace Kreta.Web.Areas.Adminisztracio.ApiControllers
{
    [ApiRoleClaimsAuthorize(true)]
    [ApiRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue)]
    public class SystemSettingsApiController : ApiController
    {
        public SortedList<int, SystemSettingGroup> GetSystemSettings()
        {

            return new SystemSettingsHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetSystemSettings(ClaimData.IsVegyes, ClaimData.FeladatKategoriak, ClaimData.IsSzirIntezmeny);

        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage ResetSystemSettings()
        {
            bool result = new SystemSettingsHelper(ConnectionTypeExtensions.GetSessionConnectionType()).ResetSystemSettings(new List<int>() { (int)RendszerBeallitasTipusEnum.Lazar_Ervin_Program_kezelese });
            if (result)
            {
                return new HttpResponseMessage(HttpStatusCode.OK);
            }

            throw new StatusError(HttpStatusCode.BadRequest, StringResourcesUtil.GetString(439) /*Nem sikerült a művelet!*/);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveSystemSettings(Dictionary<RendszerBeallitasTipusEnum, dynamic> model)
        {
            try
            {
                ModelStateDictionary modelState = ValidateModel(model);

                if (modelState.IsValid)
                {
                    new SystemSettingsHelper(ConnectionTypeExtensions.GetSessionConnectionType()).SetSystemSettings(model, ClaimData.KovTanevID);
                    return new HttpResponseMessage(HttpStatusCode.OK);
                }

                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
            }
            catch (Exception ex)
            {
                throw new StatusError(
                    HttpStatusCode.InternalServerError,
                    StringResourcesUtil.GetString(439) /*Nem sikerült a művelet!*/)
                {
                    UnHandledException = ex
                };
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveGradeWeights(Dictionary<string, string> grades)
        {
            try
            {
                List<ErtekelesModSulyCo> ertekelesModSulyCoList = grades.Select(grade => new ErtekelesModSulyCo
                {
                    ErtekelesModId = int.Parse(grade.Key),
                    Suly = int.Parse(grade.Value)
                }).ToList();

                SessionConnectionType sessionConnetionType = ConnectionTypeExtensions.GetSessionConnectionType();
                var adatszotarHelper = new AdatszotarHelper(sessionConnetionType);
                foreach (ErtekelesModSulyCo ertekelesModSulyCo in ertekelesModSulyCoList)
                {
                    AdatszotarCO adatszotarCo = adatszotarHelper.GetAdatszotarElem(ertekelesModSulyCo.ErtekelesModId);
                    adatszotarCo.Suly = ertekelesModSulyCo.Suly;
                    adatszotarHelper.Update(adatszotarCo, ClaimData.KovTanevID);
                }

                new TanuloErtekelesHelper(sessionConnetionType).UpdateTantargyAtlag();

                KretaServer.KretaServer.Instance.CacheManager.AquireCache<TantargyiAtlagCache>().ClearTantargyiAtlagRegion(sessionConnetionType.IntezmenyAzonosito);

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (Exception ex)
            {
                throw new StatusError(HttpStatusCode.InternalServerError, StringResourcesUtil.GetString(439) /*Nem sikerült a művelet!*/)
                {
                    UnHandledException = ex
                };
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteTantargyfelosztas()
        {
            try
            {
                if (ClaimData.IsActivTanev)
                {
                    var helper = new TantargyFelosztasHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                    helper.FizikaiTorlesTantargyfelosztas();

                    return new HttpResponseMessage(HttpStatusCode.OK);
                }

                throw new Exception(ErrorResource.NemEgyezikMegAzAktivTanevAKivalasztottTanevvel);
            }
            catch (CannotBeDeletedException ex)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ex.Message);
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteImportaltTantargyfelosztas()
        {
            try
            {
                var helper = new TantargyFelosztasHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                helper.DeleteAllTargyFelosztas();

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (CannotBeDeletedException ex)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ex.Message);
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteOrarendek()
        {
            try
            {
                if (ClaimData.IsActivTanev)
                {
                    var helper = new OrarendHelper(ConnectionTypeExtensions.GetSessionConnectionType());

                    helper.FizikaiTorlesOrarendek();

                    return new HttpResponseMessage(HttpStatusCode.OK);
                }

                throw new Exception(ErrorResource.NemEgyezikMegAzAktivTanevAKivalasztottTanevvel);
            }
            catch (CannotBeDeletedException ex)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ex.Message);
            }
        }

        public ErtekelesModSulyListModel GetGradeWeights()
        {
            List<ErtekelesModDictionaryItem> ertekelesModDictionaryItems = EnumExtensions.GetErtekelesModDictionaryItems(ClaimData.SelectedTanevID.Value);

            var model = new ErtekelesModSulyListModel { ErtekelesModSulyList = new List<ErtekelesModSulyModel>() };
            foreach (var ertekelesModDictionaryItem in ertekelesModDictionaryItems)
            {
                model.ErtekelesModSulyList.Add(new ErtekelesModSulyModel { ErtekelesModId = ertekelesModDictionaryItem.Id, ErtekelesModNev = ertekelesModDictionaryItem.Name, Suly = ertekelesModDictionaryItem.Suly, });
            }

            return model;
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage FejlecCheckBoxMentes(bool isMegjelenit)
        {
            var helper = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            helper.SetIntezmenyFejlecCheckBox(isMegjelenit);

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage LablecCheckBoxMentes(bool isMegjelenit)
        {
            var helper = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            helper.SetIntezmenyLablecCheckBox(isMegjelenit);

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage ImageValidate([FromBody] string image)
        {
            switch (SystemSettingsLogic.ImageValidate(image))
            {
                case Enums.ManualEnums.SystemSettings.SystemSettingsFejlecLablecSzerkesztoHibakEnum.AFajlKiterjeszteseVagyTipusaNemMegfelelo:
                    throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.AFajlKiterjeszteseVagyTipusaNemMegfelelo);
                case Enums.ManualEnums.SystemSettings.SystemSettingsFejlecLablecSzerkesztoHibakEnum.HibaTortentXMBNalNemLehetNagyobbAFajlMerete:
                    throw new StatusError(HttpStatusCode.BadRequest, string.Format(ErrorResource.HibaTortentXMBNalNemLehetNagyobbAFajlMerete, SystemSettingsLogic.MaxFileSizeMB));
                case Enums.ManualEnums.SystemSettings.SystemSettingsFejlecLablecSzerkesztoHibakEnum.AKepMagassagaMeghaladjaAMegengedettMeretet:
                    throw new StatusError(HttpStatusCode.BadRequest, string.Format(ErrorResource.AKepMagassagaMeghaladjaAMegengedettMeretet, SystemSettingsLogic.AllowedMaxHeight));
                case Enums.ManualEnums.SystemSettings.SystemSettingsFejlecLablecSzerkesztoHibakEnum.AzOsszesKepSzelessegeMeghaladjaAMegengedettMeretet:
                    throw new StatusError(HttpStatusCode.BadRequest, string.Format(ErrorResource.AzOsszesKepSzelessegeMeghaladjaAMegengedettMeretet, SystemSettingsLogic.AllowedMaxWidth));
                default:
                    return new HttpResponseMessage(HttpStatusCode.OK);
            }
        }

        public HttpResponseMessage FejlecMentes(FejlecLablecSzerkesztoModel model)
        {
            var helper = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            helper.SetIntezmenyFejlec(model.ToCo());

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage FejlecTorles()
        {
            var helper = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            helper.DeleteIntezmenyFejlec();

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        public HttpResponseMessage LablecTorles()
        {
            var helper = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            helper.DeleteIntezmenyLablec();

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage LablecMentes(FejlecLablecSzerkesztoModel model)
        {
            var helper = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            helper.SetIntezmenyLablec(model.ToCo());

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        private ModelStateDictionary ValidateModel(Dictionary<RendszerBeallitasTipusEnum, dynamic> model)
        {
            ModelStateDictionary modelState = new ModelStateDictionary();

            RendszerBeallitasTipusEnum beallitas;

            if (!model[RendszerBeallitasTipusEnum.Osztalyfonok_modosithatja_osztalyaba_jaro_tanulok_adatait])
            {
                beallitas = RendszerBeallitasTipusEnum.Osztalyfonok_megtekintheti_modosithatja_osztalyaba_jaro_tanulok_szocialis_tanugyi_es_SNI_BTM_adatait;
                if (model[beallitas])
                {
                    modelState.AddModelError(beallitas.ToString(), StringResourcesUtil.GetString(4018) /*A funkció csak akkor engedélyezhető, ha az 'Osztályfőnök módosíthatja osztályába járó tanulók adatait' érték IGEN-re van állítva.*/);
                }

                beallitas = RendszerBeallitasTipusEnum.Osztalyfonok_megtekintheti_modosithatja_osztalyaba_jaro_tanulok_zaradekat;
                if (model[beallitas])
                {
                    modelState.AddModelError(beallitas.ToString(), StringResourcesUtil.GetString(4018) /*A funkció csak akkor engedélyezhető, ha az 'Osztályfőnök módosíthatja osztályába járó tanulók adatait' érték IGEN-re van állítva.*/);
                }
            }

            if (!model[RendszerBeallitasTipusEnum.Osztalyfonok_modosithatja_osztalyaba_jaro_tanulok_adatait] || !model[RendszerBeallitasTipusEnum.Tanulo_vallasi_adatainak_kezelese])
            {
                beallitas = RendszerBeallitasTipusEnum.Osztalyfonok_megtekintheti_kezelheti_az_osztalyaba_jaro_tanulok_vallasi_adatait;
                if (model[beallitas])
                {
                    modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.FunkcioNemEngedelyezhetoAdatkezeleseiBeallitasokAlapjan);
                }
            }

            if (!model[RendszerBeallitasTipusEnum.Osztalyfonok_modosithatja_osztalyaba_jaro_tanulok_adatait] || !model[RendszerBeallitasTipusEnum.Tanulo_sportoloi_adatainak_kezelese])
            {
                beallitas = RendszerBeallitasTipusEnum.Osztalyfonok_megtekintheti_modosithatja_osztalyaba_jaro_tanulok_sportoloi_adatait;
                if (model[beallitas])
                {
                    modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.FunkcioNemEngedelyezhetoAdatkezeleseiBeallitasokAlapjan);
                }
            }

            #region Az elektronikus napló megjelenésének kezdőidőpontja és záróidőpontja

            var helper = new CsengetesiRendOrakHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            var ds = helper.GetCsengetesiOrakKezdVeg();

            TimeSpan rendszerKezdes = default;

            beallitas = RendszerBeallitasTipusEnum.Az_elektronikus_naplo_megjelenesenek_kezdoidopontja;
            if (!model.ContainsKey(beallitas))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.ElektronikusNaploMegjelenesKezdoUres);
            }
            else
            {
                if (TimeSpan.TryParse(model[beallitas], out rendszerKezdes) && rendszerKezdes.TotalMilliseconds >= 0)
                {
                    var csengetesiKezdes = ds.Tables[0].Rows[0]["Kezd"].ToString();
                    if (!string.IsNullOrWhiteSpace(csengetesiKezdes) && rendszerKezdes > TimeSpan.Parse(csengetesiKezdes))
                    {
                        modelState.AddModelError(beallitas.ToString(), StringResourcesUtil.GetString(4318) + TimeSpan.Parse(csengetesiKezdes) /*Az elektronikus napló megjelenésének kezdőidőpontja legkésőbb a legkorábbi csengetési rendi időpont kezdete lehet. Ennek értéke jelenleg: */);
                    }
                }
                else
                {
                    modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.ElektronikusNaploMegjelenesKezdoFormatum);
                }
            }

            beallitas = RendszerBeallitasTipusEnum.Az_elektronikus_naplo_megjelenesenek_zaroidopontja;
            if (!model.ContainsKey(beallitas))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.ElektronikusNaploMegjelenesZaroUres);
            }
            else
            {
                if (TimeSpan.TryParse(model[beallitas], out TimeSpan rendszerVege) && rendszerVege.TotalMilliseconds >= 0)
                {
                    var csengetesiVege = ds.Tables[0].Rows[0]["Vege"].ToString();
                    if (!string.IsNullOrWhiteSpace(csengetesiVege) && rendszerVege < TimeSpan.Parse(csengetesiVege))
                    {
                        modelState.AddModelError(beallitas.ToString(), StringResourcesUtil.GetString(4319) + TimeSpan.Parse(csengetesiVege) /*Az elektronikus napló megjelenésének záróidőpontja legkorábban a legkésőbbi csengetési rendi időpont vége lehet. Ennek értéke jelenleg: */);
                    }

                    if (rendszerKezdes > rendszerVege)
                    {
                        modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.ElektronikusNaploMegjelenesKezdoKesobbi);
                    }
                }
                else
                {
                    modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.ElektronikusNaploMegjelenesZaroFormatum);
                }
            }

            #endregion Az elektronikus napló megjelenésének kezdőidőpontja és záróidőpontja

            TimeSpan fogadoOraKezdo = default;
            TimeSpan fogadoOraZaro = default;

            beallitas = RendszerBeallitasTipusEnum.Fogado_Ora_Kezdoidopontja;
            if (!model.ContainsKey(beallitas))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.FogadoOraKezdoUres);
            }
            else if (!TimeSpan.TryParse(model[beallitas], out fogadoOraKezdo))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.FogadoOraKezdoFormatum);
            }

            beallitas = RendszerBeallitasTipusEnum.Fogado_Ora_Zaroidopontja;
            if (!model.ContainsKey(beallitas))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.FogadoOraZaroUres);
            }
            else if (!TimeSpan.TryParse(model[beallitas], out fogadoOraZaro))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.FogadoOraZaroFormatum);
            }
            else if (fogadoOraKezdo > fogadoOraZaro)
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.FogadoOraKezdoKesobbi);
            }

            TimeSpan nemKotottKezdete = default;

            beallitas = RendszerBeallitasTipusEnum.Nem_kotott_munkaido_megjelenesenek_kezdoidopontja;
            if (!model.ContainsKey(beallitas))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.NemKotottMunkaidoMegjelenesKezdoUres);
            }
            else if (!(TimeSpan.TryParse(model[beallitas], out nemKotottKezdete) && nemKotottKezdete.TotalMilliseconds >= 0))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.NemKotottMunkaidoMegjelenesKezdoFormatum);
            }

            beallitas = RendszerBeallitasTipusEnum.Nem_kotott_munkaido_megjelenesenek_zaroidopontja;
            if (!model.ContainsKey(beallitas))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.NemKotottMunkaidoMegjelenesZaroUres);
            }
            else if (!(TimeSpan.TryParse(model[beallitas], out TimeSpan nemKotottVege) && nemKotottVege.TotalMilliseconds >= 0))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.NemKotottMunkaidoMegjelenesZaroFormatum);
            }
            else
            {
                if (nemKotottKezdete > nemKotottVege)
                {
                    modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.NemKotottMunkaIdoMegjelenesKezdoKesobbi);
                }

                if (nemKotottKezdete == nemKotottVege)
                {
                    modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.NemKotottMunkaidoKezdoZaroMegegyezik);
                }
            }

            DateTime gyakorlatKezdeteDatum = default;
            DateTime gyakorlatVegDatum = default;

            beallitas = RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_kezd_datum;
            if (!model.ContainsKey(beallitas))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.OsszefuggoSzakmaiGyakorlatKezdeteUres);
            }
            else if (!DateTime.TryParse(model[beallitas], out gyakorlatKezdeteDatum))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.OsszefuggoSzakmaiGyakorlatKezdeteFormatum);
            }

            beallitas = RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_veg_datum;
            if (!model.ContainsKey(beallitas))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.OsszefuggoSzakmaiGyakorlatVegeUres);
            }
            else if (!DateTime.TryParse(model[beallitas], out gyakorlatVegDatum))
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.OsszefuggoSzakmaiGyakorlatVegeFormatum);
            }
            else if (gyakorlatKezdeteDatum > gyakorlatVegDatum)
            {
                modelState.AddModelError(beallitas.ToString(), SystemSettingsResource.OsszefuggoSzakmaiGyakorlatKezdeteKesobbi);
            }

            var (kezdoNap, utolsoNap) = new SystemSettingsHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetTanevElsoEsUtolsoNapja();
            beallitas = RendszerBeallitasTipusEnum.Naplozaras_eves_datuma;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_kezd_datum;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_veg_datum;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.I_Negyedeves_jegyek_megjelenesenek_datuma;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.II_Negyedeves_jegyek_megjelenesenek_datuma;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.III_Negyedeves_jegyek_megjelenesenek_datuma;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.IV_Negyedeves_jegyek_megjelenesenek_datuma;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.Felevi_jegyek_megjelenesenek_datuma;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.Ev_vegi_jegyek_megjelenesenek_datuma;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.Ev_vegi_jegyek_megjelenesenek_datuma_vegzos;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.Ertekeles_datumanak_minimuma;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.Ertesites_bukasra_allo_tanulokrol;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.Ertesites_bukasra_allo_vegzos_tanulokrol;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }
            beallitas = RendszerBeallitasTipusEnum.Ertesites_Tanev_rendi_valtoztatasrol_esetek;
            if (model.Keys.Contains(beallitas))
            {
                DatumEllenorzes(model[beallitas], kezdoNap, utolsoNap, modelState, beallitas);
            }

            return modelState;
        }

        private void DatumEllenorzes(string ertek, DateTime kezdoNap, DateTime utolsoNap, ModelStateDictionary modelState, RendszerBeallitasTipusEnum beallitas)
        {
            if (!(DateTime.TryParse(ertek, out DateTime naplozarasEvesDatum)))
            {
                modelState.AddModelError(beallitas.ToString(), "Rossz dátum formátum");
            }
            else if ((naplozarasEvesDatum < kezdoNap) || (naplozarasEvesDatum > utolsoNap))
            {
                modelState.AddModelError(beallitas.ToString(), "A beállított dátumnak a tanév első és utolsó napja között kell lennie.");
            }
        }

        #region Tanuló Értékelés Mondatbank

        public DataSourceResult GetTanuloErtekelesMondatbankGrid(string data, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))]
            KretaGridDataSourceRequest request)
        {
            data = data.Replace("_", string.Empty);
            var model = JsonConvert.DeserializeObject<TanuloErtekelesMondatbankSearchModel>(data);

            var helper = new TanuloErtekelesMondatbankHelper(ConnectionTypeExtensions.GetSessionConnectionType())
            {
                GridParameters = Converter.GridParameter(request)
            };
            DataSet dataSet = helper.GetTanuloErtekelesMondatbankGrid(ConvertTanuloErtekelesMondatbankSearchModelToSearchCo(model));

            return dataSet.ToDataSourceResult();
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveTanuloErtekelesMondatbankItem(TanuloErtekelesMondatbankItemModel model)
        {
            ModelState.Merge(model.Validate());

            if (ModelState.IsValid)
            {
                var helper = new TanuloErtekelesMondatbankHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                helper.SaveTanuloErtekelesMondatbankItem(model.ToCo());

                return new HttpResponseMessage(HttpStatusCode.OK);
            }

            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteTanuloErtekelesMondatbankItem([FromBody] int id)
        {
            try
            {
                var helper = new TanuloErtekelesMondatbankHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                helper.DeleteTanuloErtekelesMondatbankItems(new List<int> { id });

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (CannotBeDeletedException ex)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ex.Message);
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public IHttpActionResult DeleteSelectedTanuloErtekelesMondatbankItems(List<int> idList)
        {
            var helper = new TanuloErtekelesMondatbankHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            var (counter, errorMsg) = helper.DeleteTanuloErtekelesMondatbankItems(idList);

            if (counter == idList.Count)
                return Json(new { Message = errorMsg });

            throw new StatusError(HttpStatusCode.BadRequest, errorMsg);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public IHttpActionResult SaveSelectedTanuloErtekelesMondatbankItems(TanuloErtekelesMondatbankTobbesItemModel model)
        {
            ModelState.Merge(model.Validate());

            if (ModelState.IsValid)
            {
                var helper = new TanuloErtekelesMondatbankHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                var (counter, errorMsg) = helper.ModifyTanuloErtekelesMondatbankItems(model.ToCo());

                if (counter == model.SelectedIdList.Count)
                    return Json(new { Message = errorMsg });

                throw new StatusError(HttpStatusCode.BadRequest, errorMsg);
            }

            var a = string.Join(Environment.NewLine, ModelState.Values.Select(x => x.Errors.Select(y => y.ErrorMessage)).Select(z => string.Join(Environment.NewLine, z.ToArray())).ToArray());

            throw new StatusError(HttpStatusCode.BadRequest, a);
        }

        private TanuloErtekelesMondatbankSearchCO ConvertTanuloErtekelesMondatbankSearchModelToSearchCo(TanuloErtekelesMondatbankSearchModel model)
        {
            return new TanuloErtekelesMondatbankSearchCO()
            {
                EvfolyamTipusIdList = model.EvfolyamTipusIdList,
                RovidNev = model.RovidNevS,
                Szoveg = model.SzovegS,
                TantargyIdList = model.TantargyIdList.Select(x => (tantargyId: x, tipusId: x != 0 ? TanuloErtekelesMondatbankHelper.GetTanuloErtekelesMondatbankTipusIdByTantargyId(x) : (int)ErtMondatbankTipusEnum.Tantargy)).ToList(),
                TanuloErtekelesTipusIdList = model.TanuloErtekelesTipusIdList,
            };
        }

        #endregion Tanuló Értékelés Mondatbank

        #region CsoportTipus

        public List<CsoportTipusModel> GetCsoportTipusList()
        {
            List<CsoportTipusCO> csoportTipusList = new AdatszotarHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetCsoportTipusList();

            return csoportTipusList.Select(ConvertCOToModel).ToList();
        }

        public DataSourceResult GetCsoportTipusGridList([ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            List<CsoportTipusCO> csoportTipusList = new AdatszotarHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetCsoportTipusList();
            return csoportTipusList.Select(ConvertCOToGridModel).ToList().ToDataSourceResult(request);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveCsoportTipusList(List<CsoportTipusModel> model)
        {
            if (ModelState.IsValid)
            {
                List<CsoportTipusCO> csoportTipusList = model.Select(ConvertModelToCO).ToList();

                new AdatszotarHelper(ConnectionTypeExtensions.GetSessionConnectionType()).SaveCsoportTipusList(csoportTipusList, ClaimData.KovTanevID);

                return new HttpResponseMessage(HttpStatusCode.OK);
            }

            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }

        private CsoportTipusModel ConvertCOToModel(CsoportTipusCO csoportTipus)
        {
            return new CsoportTipusModel
            {
                Id = csoportTipus.Id,
                Nev = csoportTipus.Nev,
                IsTanoraiCelu = csoportTipus.IsTanoraiCelu,
                IsProtected = csoportTipus.IsProtected,
                OraPerc = csoportTipus.OraPerc
            };
        }

        private CsoportTipusGridModel ConvertCOToGridModel(CsoportTipusCO csoportTipus)
        {
            return new CsoportTipusGridModel
            {
                ID = csoportTipus.Id.ToString(),
                Nev = csoportTipus.Nev,
                IsTanoraiCelu = csoportTipus.IsTanoraiCelu,
                IsProtected = csoportTipus.IsProtected,
                OraPerc = csoportTipus.OraPerc
            };
        }

        private CsoportTipusCO ConvertModelToCO(CsoportTipusModel csoportTipus)
        {
            return new CsoportTipusCO
            {
                Id = csoportTipus.Id,
                Nev = csoportTipus.Nev,
                IsTanoraiCelu = csoportTipus.IsTanoraiCelu,
                IsProtected = csoportTipus.IsProtected,
                OraPerc = csoportTipus.OraPerc
            };
        }

        #endregion CsoportTipus

        #region JuttatasAdatok

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public void JuttatasAdatokUjraGeneralasa()
        {
            new SzakkepzesiJuttatasokHelper(ConnectionTypeExtensions.GetSessionConnectionType()).UpdateOsszesTanuloSzakkepzesiJuttatasok();
        }

        //[HttpPost]
        //[ApiValidateAjaxAntiForgeryToken]
        //public void FeleviAtlagokUjraGeneralasa()
        //{
        //    new SzakkepzesiJuttatasokHelper(ConnectionTypeExtensions.GetSessionConnectionType()).UpdateOsszesTanuloAtlag(AtlagTipusEnum.Felevi);
        //}

        //[HttpPost]
        //[ApiValidateAjaxAntiForgeryToken]
        //public void EvvegiAtlagokUjraGeneralasa()
        //{
        //    new SzakkepzesiJuttatasokHelper(ConnectionTypeExtensions.GetSessionConnectionType()).UpdateOsszesTanuloAtlag(AtlagTipusEnum.Evvegi);
        //}
        #endregion
    }
}