using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.ModelBinding;
using System.Web.Http.Results;
using Kendo.Mvc.UI;
using Kreta.BusinessLogic.Classes;
using Kreta.BusinessLogic.Exceptions;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Logic;
using Kreta.BusinessLogic.Security;
using Kreta.Core;
using Kreta.Core.Exceptions;
using Kreta.Enums;
using Kreta.Enums.ManualEnums;
using Kreta.Framework.Entities;
using Kreta.Framework.Util;
using Kreta.Resources;
using Kreta.Web.Areas.Tanulo.Helper;
using Kreta.Web.Areas.Tanulo.Models;
using Kreta.Web.Helpers;
using Kreta.Web.Helpers.Error;
using Kreta.Web.Helpers.Grid;
using Kreta.Web.Models;
using Kreta.Web.Security;
using Newtonsoft.Json;
using SDA.DataProvider;

namespace Kreta.Web.Areas.Tanulo.ApiControllers
{
    [ApiRoleClaimsAuthorize(true)]
    [ApiRolePackageAuthorize(KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue, KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.KollegiumModul.ClaimValue)]
    public class KollegiumTanuloApiController : ApiController
    {
        public DataSourceResult GetTanuloGrid(string data, DataSourceRequest request)
        {
            var (gridParameter, modelList) = GetGridData(data, request);

            return modelList.ToDataSourceResult(gridParameter);
        }

        public HttpResponseMessage GetExport(string data, DataSourceRequest request)
        {
            try
            {
                var (gridParameter, modelList) = GetGridData(data, request);

                modelList = modelList.SortingAndPaging(gridParameter.OrderDictionary);

                var simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos<TanuloGridModel>(TanuloGridModel.TanuloExportAttributeId);

                var memoryStream = SimpleExportLogic.GetExport(TanuloResource.TanuloExportSheetName, simpleExportColumnCos, modelList, ClaimData.SelectedTanevID.Value);

                return HttpResponseExtensions.GetFileHttpResponse(memoryStream.ToArray(), $"{TanuloResource.TanuloExportFileName}.xlsx");
            }
            catch (Exception ex)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.HibaTortentAFajlExportalasaKozben) { UnHandledException = ex };
            }
        }

        private (GridParameters gridParameter, List<TanuloGridModel> modelList) GetGridData(string data, DataSourceRequest request)
        {
            data = data.Replace("_", string.Empty);

            var model = JsonConvert.DeserializeObject<TanuloSearchModel>(data);

            var co = model.ConvertModelToCo(ConnectionTypeExtensions.GetSessionConnectionType(), ClaimData.IsActivTanev);
            co.LekerdezesNapja = DateTime.Today;

            GridParameters gridParameter = Converter.GridParameter(request);

            var coList = new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetTanuloItemCoList(co);

            var modelList = new List<TanuloGridModel>();

            foreach (var item in coList)
            {
                var gridModel = new TanuloGridModel(item);
                modelList.Add(gridModel);
            }

            return (gridParameter, modelList);
        }

        #region Tanuló mentés/módosítás/törlés

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        [ApiRolePackageAuthorize(KretaClaimPackages.KollegiumModul.ClaimValue)]
        public HttpResponseMessage DeleteTanulo([FromBody] int tanuloId)
        {
            try
            {
                TanuloLogic.TanuloDelete(tanuloId);
                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (CannotBeDeletedException ex)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ex.Message);
            }
            catch (EntityDeleteFailedException ex)
            {
                var tanuloAdatCO = TanuloLogic.GetTanuloAdatCO(tanuloId);
                var entityName = BusinessLogic.Extensions.NameExtensions.GetNevSorrendben("F", tanuloAdatCO.Elotag, tanuloAdatCO.CsaladiNev, tanuloAdatCO.UtoNev);
                var uzenet = string.Format(ErrorResource.TanuloNemTorolhetoKapcsolatMiatt, entityName, ex.ConnectionErrorMessage);

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

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        [ApiRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue, KretaClaimPackages.IsLEPKezelo.ClaimValue)]
        public HttpResponseMessage DeleteJogviszonySzuneteltetes(JogviszonySzuneteltetesDeleteModel model)
        {
            try
            {
                if (model.IsJogviszonySzuneteltetese && model.GridCnt == 1)
                    throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.JogviszonySzunetLegalabbEgyIdoszakKotelezo);

                var helper = new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                helper.DeleteJogviszonySzuneteltetes(model.Id.Value);

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

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveJogviszonySzuneteltetes(JogviszonySzuneteltetesModel model)
        {
            try
            {
                if (model.JogviszonySzuneteltetesKezdete.Value > model.JogviszonySzuneteltetesVege.Value)
                    ModelState.AddModelError("JogviszonySzuneteltetes1", ErrorResource.JogviszonySzuneteltetes);

                var tanevHelper = new TanevHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                var tanevData = tanevHelper.GetTanevInfo();

                if (model.JogviszonySzuneteltetesKezdete.Value < tanevData.KezdoNap)
                    ModelState.AddModelError("JogviszonySzuneteltetes2", ErrorResource.JogviszonySzuneteltetesKezdeteTanevben);

                if (model.JogviszonySzuneteltetesVege.Value > tanevData.UtolsoNap)
                    ModelState.AddModelError("JogviszonySzuneteltetes3", ErrorResource.JogviszonySzuneteltetesVegeTanevben);

                if (ModelState.IsValid)
                {
                    var helper = new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                    helper.SaveJogviszonySzuneteltetes(model.TanuloId.Value, model.OsztalyId, model.JogviszonySzuneteltetesKezdete.Value, model.JogviszonySzuneteltetesVege.Value, ClaimData.KovTanevID);
                    return Request.CreateResponse(HttpStatusCode.OK);
                }

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

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        [ApiRolePackageAuthorize(KretaClaimPackages.KollegiumModul.ClaimValue)]
        public IHttpActionResult DeleteSelectedTanulo(List<int> idList)
        {
            return Json(new { Message = TanuloLogic.DeleteSelectedTanulo(idList) });
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveTanulo(TanuloModel model)
        {
            try
            {
                var felhasznaloiNevGeneralasModja = TanuloLogic.GetFelhasznaloiNevGeneralasModja(model);
                TanuloLogic.TanuloCustomValidation(ModelState, model, felhasznaloiNevGeneralasModja, OktNevelesiKategoriaEnum.Kollegium);

                if (ModelState.IsValid)
                {
                    var response = TanuloLogic.TanuloMentese(model, felhasznaloiNevGeneralasModja);
                    return Request.CreateResponse(HttpStatusCode.OK, response);
                }

                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
            catch (Check4TValidacioExistsException)
            {
                throw new StatusError(HttpStatusCode.BadRequest, CommonResource.AMegadottFelhasznaloiAdatokkalMarLetezikFelhasznalo);
            }
        }

        public HttpResponseMessage SaveData(TanuloTobbesModModel model)
        {
            TanuloLogic.TanuloTobbesModCustomValidation(ModelState, model);

            if (ModelState.IsValid)
                return TanuloLogic.SaveData(ClaimData.SelectedTanevID.Value, model);

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

        public HttpResponseMessage PreValidation(TanuloTobbesModModel model)
        {
            TanuloLogic.TanuloTobbesModCustomValidation(ModelState, model);

            if (ModelState.IsValid)
            {
                string warningMessage = TanuloLogic.ValidateOnSaveData(model);
                if (!string.IsNullOrWhiteSpace(warningMessage))
                {
                    return Request.CreateResponse(HttpStatusCode.BadRequest, warningMessage);
                }

                return TanuloLogic.SaveData(ClaimData.SelectedTanevID.Value, model);
            }

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

        #endregion Tanuló mentés/módosítás/törlés

        #region Generálás

        public HttpResponseMessage JelszoGeneralas(int userId, bool isGondviselo)
        {
            var result = TanuloLogic.JelszoGeneralas(userId, isGondviselo);
            return Request.CreateResponse(HttpStatusCode.OK, result);
        }

        public System.Web.Mvc.JsonResult FelhasznalonevGeneralas([FromBody] FelhasznalonevGeneralasModel felhasznalonevGeneralasModel)
        {
            try
            {
                var result = new System.Web.Mvc.JsonResult { Data = TanuloLogic.FelhasznalonevGeneralas(felhasznalonevGeneralasModel) };
                return result;
            }

            catch (UniqueKeyViolationException)
            {
                throw new StatusError(HttpStatusCode.BadRequest, CommonResource.AMegadottFelhasznalonevMarLetezik);
            }
            catch (UserNameExistsException)
            {
                throw new StatusError(HttpStatusCode.BadRequest, CommonResource.AMegadottFelhasznalonevMarLetezik);
            }
        }

        #endregion

        #region Tanuló elérhetőség mentés/módosítás/törlés

        public CimElerhetosegModel GetTanuloElerhetosegTel(int id)
        {
            var co = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetTanuloElerhetosegTelById(id);
            return CimElerhetosegModel.ConvertCoToModel(co);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveElerhetosegTel(CimElerhetosegModel model)
        {
            Kreta.Web.Classes.Utils.TelefonSzamValidation(ModelState, model.Telefon, model.TelefonTipus, TelefonszamTulajdonosEnum.Tanulo);

            if (ModelState.IsValid)
            {
                try
                {
                    var co = CimElerhetosegModel.ConvertModelToTanuloElerhetosegTelCO(model);
                    new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType()).TanuloElerhetosegTelMentese(co, ClaimData.KovTanevID);

                    return new HttpResponseMessage(HttpStatusCode.OK);

                }
                catch (BlException ex)
                {
                    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
                }
            }

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

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteElerhetosegTel([FromBody] int id)
        {
            try
            {
                var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
                helper.TanuloElerhetosegTelTorlese(id);

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (EntityDeleteFailedException ex)
            {
                var uzenet = string.Format(ErrorResource.NemTorolhetoKapcsolatMiatt, TanuloResource.Telefonszam, ex.ConnectionErrorMessage);
                throw new StatusError(HttpStatusCode.BadRequest, uzenet);
            }
        }

        public CimElerhetosegModel GetTanuloElerhetosegEmail(int id)
        {
            var co = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetTanuloElerhetosegEmailById(id);
            return CimElerhetosegModel.ConvertCoToModel(co);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveElerhetosegEmail(CimElerhetosegModel model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    var co = CimElerhetosegModel.ConvertModelToTanuloElerhetosegEmailCO(model);
                    new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType()).TanuloElerhetosegEmailMentese(co, ClaimData.KovTanevID);

                    return new HttpResponseMessage(HttpStatusCode.OK);
                }
                catch (BlException ex)
                {
                    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
                }
            }

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

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteElerhetosegEmail([FromBody] int id)
        {
            try
            {
                var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
                helper.TanuloElerhetosegEmailTorlese(id);

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (EntityDeleteFailedException ex)
            {
                var uzenet = string.Format(ErrorResource.NemTorolhetoKapcsolatMiatt, TanuloResource.EmailCim, ex.ConnectionErrorMessage);
                throw new StatusError(HttpStatusCode.BadRequest, uzenet);
            }
        }

        public CimElerhetosegModel GetTanuloElerhetosegCim(int id)
        {
            var co = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetTanuloGondviseloCimById(id);
            return CimElerhetosegModel.ConvertCoToModel(co);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveElerhetosegCim(CimElerhetosegModel model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    var co = CimElerhetosegModel.ConvertModelToElerhetosegCimCO(model);
                    new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType()).TanuloGondviseloCimMentese(co, ClaimData.KovTanevID);

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

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

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteElerhetosegCim([FromBody] int id)
        {
            try
            {
                var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
                helper.TanuloGondviseloCimTorlese(id);

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (EntityDeleteFailedException ex)
            {
                var uzenet = string.Format(ErrorResource.NemTorolhetoKapcsolatMiatt, TanuloResource.Cim, ex.ConnectionErrorMessage);
                throw new StatusError(HttpStatusCode.BadRequest, uzenet);
            }
        }

        #endregion Tanuló elérhetőség mentés/módosítás/törlés

        #region Közösségi szolgálat mentés/módosítás/törlés

        public TanuloKozszolgModel GetTanuloKozSzolg(int id)
        {
            var co = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetKozossegiSzolgalatbyId(id);
            return TanuloKozszolgModel.ConvertCoToModel(co);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveKozszolg(TanuloKozszolgModel model)
        {
            if (ModelState.IsValid)
            {
                new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType()).KozossegiSzolgalatMentese(TanuloKozszolgModel.ConvertModelToCo(model));
                return new HttpResponseMessage(HttpStatusCode.OK);
            }

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

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteKozszolg([FromBody] int id)
        {
            try
            {
                var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
                helper.KozossegiSzolgalatTorlese(id);

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (EntityDeleteFailedException ex)
            {
                var uzenet = string.Format(ErrorResource.NemTorolhetoKapcsolatMiatt, TanuloResource.KozossegiSzolgalat, ex.ConnectionErrorMessage);
                throw new StatusError(HttpStatusCode.BadRequest, uzenet);
            }
        }

        #endregion Közösségi szolgálat mentés/módosítás/törlés

        #region Gondviselő mentés/módosítás/törlés

        public TanuloModGondviseloModel GetTanuloGondviselo(int id)
        {
            var co = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetTanuloGondviseloById(id);
            return TanuloModGondviseloModel.ConvertCoToModel(co);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveGondviselo(TanuloModGondviseloModel model)
        {
            try
            {
                TanuloLogic.TanuloGondviseloSaveValidation(ModelState, model);
                if (!ModelState.IsValid)
                    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);

                var co = TanuloModGondviseloModel.ConvertModelToCo(model);
                var belepesList = new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType()).TanuloGondviseloMentese(co, ClaimData.IsSzirIntezmeny, ClaimData.KovTanevID);
                var fileString = TanuloLogic.GondviseloFileGenerate(model.FileLetoltesSzukseges, belepesList);

                var response = new { EmailErrors = belepesList.EmailErrors, FileString = fileString };
                return Request.CreateResponse(HttpStatusCode.OK, response);
            }
            catch (BlException ex)
            {
                throw new StatusError(HttpStatusCode.BadRequest, ex.Message) { UnHandledException = ex.InnerException };
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteGondviselo([FromBody] int id)
        {
            try
            {
                return TanuloLogic.DeleteTanulogondviselo(id);
            }
            catch (EntityDeleteFailedException ex)
            {
                var uzenet = string.Format(ErrorResource.NemTorolhetoKapcsolatMiatt, TanuloResource.Gondviselo, ex.ConnectionErrorMessage);
                throw new StatusError(HttpStatusCode.BadRequest, uzenet);
            }
        }

        #endregion Gondviselő mentés/módosítás/törlés

        #region Gondviselő elérhetőség mentés/módosítás/törlés

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public CimElerhetosegModel GetGondviseloElerhetosegCim(int id)
        {
            var co = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetTanuloGondviseloCimById(id);
            return CimElerhetosegModel.ConvertCoToModel(co);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveGondviseloCim(CimElerhetosegModel model)
        {
            try
            {
                var helper = new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                var customModelState = TanuloLogic.CheckGondviseloCimCustomValidation(ModelState, model);
                if (model.TanulovalEgyezik)
                {
                    var co = CimElerhetosegModel.ConvertModelToElerhetosegCimCO(model);
                    helper.TanuloGondviseloCimMentese(co, ClaimData.KovTanevID);

                    return new HttpResponseMessage(HttpStatusCode.OK);
                }

                if (customModelState.IsValid)
                {
                    var co = CimElerhetosegModel.ConvertModelToElerhetosegCimCO(model);
                    helper.TanuloGondviseloCimMentese(co, ClaimData.KovTanevID);

                    return new HttpResponseMessage(HttpStatusCode.OK);
                }

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

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteGondviseloCim([FromBody] int id)
        {
            try
            {
                var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
                helper.TanuloGondviseloCimTorlese(id);

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (EntityDeleteFailedException ex)
            {
                var uzenet = string.Format(ErrorResource.NemTorolhetoKapcsolatMiatt, TanuloResource.Cim, ex.ConnectionErrorMessage);
                throw new StatusError(HttpStatusCode.BadRequest, uzenet);
            }
        }

        #endregion Gondviselő elérhetőség mentés/módosítás/törlés

        #region Felmentés mentés/módosítás/törlés

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveFelmentes(TanuloFelmentesModel model)
        {
            TanuloLogic.TanuloFelmentesCustomValidation(ModelState, model);

            if (ModelState.IsValid)
            {
                try
                {
                    var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
                    var co = TanuloFelmentesModel.ConvertModelToCo(model);

                    if (co.IsKorabbiMulasztasokEllenorzese && co.Kezdete.Value < DateTime.Now && co.OraMentesites)
                    {
                        var mulasztasDataSet = helper.CheckModosuloKorabbiMulasztasok(co);

                        if (mulasztasDataSet.Tables[0].Rows.Count != 0)
                        {
                            return Request.CreateResponse(HttpStatusCode.OK, mulasztasDataSet.ToDataSourceResult(), Configuration.Formatters.JsonFormatter);
                        }
                    }

                    if (model.ID == 0)
                    {
                        foreach (var item in model.TantargyIdList)
                        {
                            co.TantargyId = int.Parse(item);
                            helper.TanuloFelmentesMentese(co, ClaimData.KovTanevID);
                        }
                    }
                    else
                    {
                        helper.TanuloFelmentesMentese(co, ClaimData.KovTanevID);
                    }
                    return new HttpResponseMessage(HttpStatusCode.OK);
                }
                catch (BlException e)
                {
                    var error = new StatusError(HttpStatusCode.BadRequest, e.Message);
                    throw error;
                }
            }

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

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public TanuloFelmentesModel GetFelmentes(int id)
        {
            var co = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetTanuloFelmentesById(id);
            return TanuloFelmentesModel.ConvertCoToModel(co);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteFelmentes([FromBody] int id)
        {
            try
            {
                var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
                helper.TanuloFelmentesTorles(id);

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (EntityDeleteFailedException ex)
            {
                var uzenet = string.Format(ErrorResource.NemTorolhetoKapcsolatMiatt, TanuloResource.Felmentes, ex.ConnectionErrorMessage);
                throw new StatusError(HttpStatusCode.BadRequest, uzenet);
            }
        }

        #endregion Felmentés mentés/módosítás/törlés

        #region GridHelpers
        public DataSourceResult GetOsztalyCsoportGrid(string data, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var model = JsonConvert.DeserializeObject<TanuloDetailModel>(data);
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetOsztalyCsoport(model.TanuloId, (int)OktNevelesiKategoriaEnum.Kollegium, !model.MegNemAktivOsztalyok);
            return ds.ToDataSourceResult();
        }

        public DataSourceResult GetTanultTantargyakGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()) { GridParameters = Converter.GridParameter(request) };
            var tanuloId = SDAConvert.ToNullableInt32(id);

            DataSourceResult result = tanuloId.IsEntityId()
                ? helper.GetTanultTantargyak(tanuloId.Value, (int)OktNevelesiKategoriaEnum.Kollegium).ToDataSourceResult()
                : new DataSourceResult();
            return result;
        }

        public DataSourceResult GetTanarokTantargyakGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetTanarokTantargyak(int.Parse(id));
            return ds.ToDataSourceResult();
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.KollegiumModul.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue, KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue, KretaClaimPackages.Tanar.ClaimValue)]
        public DataSourceResult GetGondviselokGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetGondviselok(int.Parse(id), true);
            return ds.ToDataSourceResult();
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.KollegiumModul.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue, KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue, KretaClaimPackages.Tanar.ClaimValue)]
        public DataSourceResult GetGondviselokCimGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetGondviseloCimek(int.Parse(id));
            return ds.ToDataSourceResult();
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.KollegiumModul.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue, KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue, KretaClaimPackages.Tanar.ClaimValue)]
        public DataSourceResult GetGondviselokCimDetailGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetGondviseloCimekByGondviselo(int.Parse(id));
            return ds.ToDataSourceResult();
        }

        public DataSourceResult GetOrarendiOrakGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetOrarendiOrak(int.Parse(id));
            return ds.ToDataSourceResult();
        }

        public DataSourceResult GetErtekelesekGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetErtekelesek(int.Parse(id), (int)OktNevelesiKategoriaEnum.Kollegium);
            return ds.ToDataSourceResult();
        }

        public DataSourceResult GetMulasztasokGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetMulasztasok(int.Parse(id), (int)OktNevelesiKategoriaEnum.Kollegium);
            return ds.ToDataSourceResult();
        }

        public DataSourceResult GetIgazolasokGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()) { GridParameters = Converter.GridParameter(request) };
            var tanuloId = SDAConvert.ToNullableInt32(id);

            DataSourceResult result = tanuloId.IsEntityId()
                ? helper.GetIgazolasok(tanuloId.Value, null).ToDataSourceResult()
                : new DataSourceResult();
            return result;
        }

        public DataSourceResult GetFeljegyzesekHaviGrid(string id, string osztalycsoportId, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType())
            {
                GridParameters = Converter.GridParameter(request)
            };
            var tanuloId = SDAConvert.ToNullableInt32(id);
            var osztalyId = SDAConvert.ToNullableInt32(osztalycsoportId);
            DataSourceResult result = tanuloId.IsEntityId() && osztalyId.IsEntityId()
                ? helper.GetFeljegyzesekHavi(tanuloId.Value, osztalyId.Value).ToDataSourceResult()
                : new DataSourceResult();
            return result;
        }

        public DataSourceResult GetElozmenyekGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetElozmenyek(int.Parse(id), null);
            return ds.ToDataSourceResult();
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.KollegiumModul.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue, KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue, KretaClaimPackages.Tanar.ClaimValue)]
        public DataSourceResult GetElerhetosegCimGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetCim(int.Parse(id));
            return ds.ToDataSourceResult();
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.KollegiumModul.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue, KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue, KretaClaimPackages.Tanar.ClaimValue)]
        public DataSourceResult GetElerhetosegTelGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetTelefonSzam(int.Parse(id));
            return ds.ToDataSourceResult();
        }

        public DataSourceResult GetFelmentesekGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()) { GridParameters = Converter.GridParameter(request) };
            var tanuloId = SDAConvert.ToNullableInt32(id);

            DataSourceResult result = tanuloId.IsEntityId()
                ? helper.GetTanulokFelmentesei(new List<int> { tanuloId.Value }).ToDataSourceResult()
                : new DataSourceResult();
            return result;
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.KollegiumModul.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue, KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue, KretaClaimPackages.Tanar.ClaimValue)]
        public DataSourceResult GetElerhetosegEmailGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetEmails(int.Parse(id));
            return ds.ToDataSourceResult();
        }

        public DataSourceResult GetKozossegiSzolgalatGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetKozossegiSzolgalat(int.Parse(id));
            return ds.ToDataSourceResult();
        }

        public DataSourceResult GetGondviseloUtolsoBelepesGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            helper.GridParameters = Converter.GridParameter(request);

            var ds = helper.GetGondviseloUtolsoBelepes(int.Parse(id));
            return ds.ToDataSourceResult();
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue, KretaClaimPackages.FelhasznaloMunkakoreNemTiltoListas.ClaimValue)]
        public DataSourceResult GetJogviszonySzuneteltetesGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()) { GridParameters = Converter.GridParameter(request) };
            var tanuloId = SDAConvert.ToNullableInt32(id);

            DataSourceResult result = tanuloId.IsEntityId()
                ? helper.GetJogviszonySzuneteltetes(tanuloId.Value, (int)OktNevelesiKategoriaEnum.Kollegium).ToDataSourceResult()
                : new DataSourceResult();
            return result;
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.KollegiumModul.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue, KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue, KretaClaimPackages.Tanar.ClaimValue)]
        public DataSourceResult GetJogviszonyGrid(string id, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var helper = new TanuloHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            var co = helper.GetJogviszony(int.Parse(id));

            return co.ToDataSourceResult(Converter.GridParameter(request));
        }

        #endregion GridHelpers

        #region Export

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        [ApiRolePackageAuthorize(KretaClaimPackages.KollegiumModul.ClaimValue)]
        public JsonResult<List<ExportColumn>> GetExportColumnsTanulokLakcimmel()
        {
            return Json(TanuloLogic.GetColumnsTanulokLakcimmel());
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        [ApiRolePackageAuthorize(KretaClaimPackages.KollegiumModul.ClaimValue)]
        public JsonResult<List<ExportColumn>> GetExportColumns()
        {
            return Json(TanuloLogic.GetColumnsforExport());
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.KollegiumModul.ClaimValue)]
        public DataSourceResult GetTanuloExportGrid(string searchFilter, string sortColumn, string sortDir)
        {
            return TanuloLogic.GetDataSetTanuloExport(searchFilter, sortColumn, sortDir).ToDataSourceResult();
        }

        #endregion Export

        [HttpGet]
        public JsonResult<bool> HasGondviseloAlapertelmezettCim(int gondviseloId)
        {
            var tanuloHelper = new TanuloHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
            var letezikGondviseloAlapertelmezettCim = tanuloHelper.HasGondviseloAlapertelmezettCim(gondviseloId);
            return Json(letezikGondviseloAlapertelmezettCim);
        }
    }
}