using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Results;
using System.Web.Mvc;
using Kendo.Mvc.UI;
using Kreta.BusinessLogic.Classes;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Security;
using Kreta.Client.LEP;
using Kreta.Core.Configuratiaton.Interface;
using Kreta.Enums;
using Kreta.Resources;
using Kreta.Web.Areas.LEPModul.Models;
using Kreta.Web.Helpers;
using Kreta.Web.Helpers.Error;
using Kreta.Web.Helpers.Grid;
using Kreta.Web.Security;
using Newtonsoft.Json;

namespace Kreta.Web.Areas.LEPModul.ApiControllers
{
    [ApiRoleClaimsAuthorize(true)]
    [ApiRolePackageAuthorize(KretaClaimPackages.IsLEPKezelo.ClaimValue, KretaClaimPackages.Ellenorzo.ClaimValue)]
    public class EloadasokKezeleseApiController : ApiController
    {
        private readonly ILepConfiguration LepConfiguration;

        public EloadasokKezeleseApiController(ILepConfiguration lepConfiguration)
        {
            LepConfiguration = lepConfiguration ?? throw new ArgumentNullException(nameof(lepConfiguration));
        }

        public DataSourceResult GetEloadasokGrid(string data, [System.Web.Http.ModelBinding.ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            try
            {
                EloadasokSearchModel model = JsonConvert.DeserializeObject<EloadasokSearchModel>(data);
                List<EloadasokGridModel> lEloadasok = new List<EloadasokGridModel>();
                List<EloadasokGridModel> LResult = new List<EloadasokGridModel>();
                model.EvfolyamIdList = new List<int>();

                if (model.EvfolyamID.HasValue)
                {
                    model.EvfolyamIdList.Add(model.EvfolyamID.Value);
                }
                else
                {
                    if (!model.IsMindenEvfolyamJog)
                    {
                        foreach (var item in new OsztalyCsoportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetLEPOszlyCspoortByTanevAndFelhasznalo(ClaimData.FelhasznaloId))
                        {
                            model.EvfolyamIdList.Add(item.EvfolyamTipusa);
                        }
                    }
                }

                var client = new LepClient(LepConfiguration.Url, LepConfiguration.ApiKey);
                var kozpontiResult = client.GetEloadasok(ClaimData.IntezmenyAzonosito, model.EvfolyamIdList);

                if (kozpontiResult != null)
                {
                    var groupedResult = kozpontiResult.GroupBy(x => (x.Id, x.IranyitoSzam, x.Telepules, x.KozteruletNev, x.KozteruletJellegNev, x.Hazszam, x.Kezdete, x.Vege, x.SzervezetNev, x.Nev, x.Leiras))
                        .ToDictionary(x => x.Key, x =>
                            (EvfolyamIdList: x.Select(y => y.Evfolyam).ToList(),
                             Ferohelyek: x.Select(y => (
                                FerohelyMax: y.KiseroLetszam + y.TanuloLetszam,
                                JelentkezokSzama: (y.KiseroJelentkezokSzama ?? 0) + (y.TanuloJelentkezokSzama ?? 0))).Distinct().Single(),
                             EngedelyezettLetszamok: x.Select(y => (
                                KiseroLetszam: y.KiseroLetszam,
                                KiseroLetszamFennmarado: y.KiseroLetszamFennmarado,
                                TanuloLetszam: y.TanuloLetszam,
                                TanuloLetszamFennmarado: y.TanuloLetszamFennmarado)).Distinct().Single(),
                             IsToroltJelentkezes: x.Select(y => y.IsToroltJelentkezes).Distinct().Single()));

                    foreach (var item in groupedResult)
                    {
                        if (item.Value.IsToroltJelentkezes)
                        {
                            new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType()).DeleteTanulokByEloadasId(item.Key.Id);
                        }
                        if (item.Value.EvfolyamIdList.Intersect(Core.Constants.LepEnabledEvfolyam).Any())
                        {
                            lEloadasok.Add(new EloadasokGridModel()
                            {
                                ID = $"{item.Key.Id}",
                                Helyszin = $"{item.Key.IranyitoSzam} {item.Key.Telepules} {item.Key.KozteruletNev} {item.Key.KozteruletJellegNev} {item.Key.Hazszam}",
                                Datum = item.Key.Kezdete.Date,
                                EloadasKezdete = item.Key.Kezdete,
                                EloadasVege = item.Key.Vege,
                                SzervezetNev = item.Key.SzervezetNev,
                                EloadasNev = item.Key.Nev,
                                FerohelyFoglaltHelyek = $"{item.Value.Ferohelyek.FerohelyMax} / {item.Value.Ferohelyek.JelentkezokSzama}",
                                EvFolyamIdList = string.Join(",", item.Value.EvfolyamIdList),
                                Leiras = item.Key.Leiras,
                                KiseroLetszam = item.Value.EngedelyezettLetszamok.KiseroLetszam,
                                TanuloLetszam = item.Value.EngedelyezettLetszamok.TanuloLetszam,
                                KiseroLetszamFennmarado = item.Value.EngedelyezettLetszamok.KiseroLetszamFennmarado,
                                TanuloLetszamFennmarado = item.Value.EngedelyezettLetszamok.TanuloLetszamFennmarado,
                                IsToroltJelentkezes = item.Value.IsToroltJelentkezes,
                            });
                        }
                    }

                    if (!string.IsNullOrWhiteSpace(model.EloadasNev))
                        lEloadasok = lEloadasok.Where(x => x.EloadasNev.ToLower().Contains(model.EloadasNev.ToLower())).ToList();

                    if (!string.IsNullOrWhiteSpace(model.Helyszin))
                        lEloadasok = lEloadasok.Where(x => x.Helyszin.ToLower().Contains(model.Helyszin.ToLower())).ToList();

                    if (model.EvfolyamID.HasValue)
                        lEloadasok = lEloadasok.Where(x => x.EvFolyamIdList.Contains(model.EvfolyamID.Value.ToString())).ToList();

                    if (model.IdoszakKezdete.HasValue || model.IdoszakVege.HasValue)
                    {
                        if (model.IdoszakKezdete.HasValue && model.IdoszakVege.HasValue)
                            lEloadasok = lEloadasok.Where(x => x.Datum >= model.IdoszakKezdete && x.Datum <= model.IdoszakVege).ToList();

                        if (model.IdoszakKezdete.HasValue && !model.IdoszakVege.HasValue)
                            lEloadasok = lEloadasok.Where(x => x.Datum >= model.IdoszakKezdete).ToList();

                        if (!model.IdoszakKezdete.HasValue && model.IdoszakVege.HasValue)
                            lEloadasok = lEloadasok.Where(x => x.Datum <= model.IdoszakVege).ToList();
                    }

                    if (!string.IsNullOrWhiteSpace(model.SzervezetNev))
                        lEloadasok = lEloadasok.Where(x => x.SzervezetNev.ToLower().Contains(model.SzervezetNev.ToLower())).ToList();

                    if (model.IdoszakKezdeteTime.HasValue)
                        lEloadasok = lEloadasok.Where(x => x.EloadasKezdete.Value.TimeOfDay == model.IdoszakKezdeteTime.Value.TimeOfDay).ToList();

                    if (model.IdoszakVegeTime.HasValue)
                        lEloadasok = lEloadasok.Where(x => x.EloadasVege.Value.TimeOfDay == model.IdoszakVegeTime.Value.TimeOfDay).ToList();
                }

                if (lEloadasok.Count > 0)
                {
                    if (request.Sorts.Count == 1)
                    {
                        var sort = request.Sorts[0];
                        if (sort.Member == "Datum" && sort.SortDirection == ListSortDirection.Ascending)
                        { LResult = lEloadasok.OrderBy(x => x.Datum).ToList(); }
                        if (sort.Member == "Datum" && sort.SortDirection == ListSortDirection.Descending)
                        { LResult = lEloadasok.OrderByDescending(x => x.Datum).ToList(); }

                        if (sort.Member == "EloadasKezdete" && sort.SortDirection == ListSortDirection.Ascending)
                        { LResult = lEloadasok.OrderBy(x => x.EloadasKezdete).ToList(); }
                        if (sort.Member == "EloadasKezdete" && sort.SortDirection == ListSortDirection.Descending)
                        { LResult = lEloadasok.OrderByDescending(x => x.EloadasKezdete).ToList(); }

                        if (sort.Member == "EloadasVege" && sort.SortDirection == ListSortDirection.Ascending)
                        { LResult = lEloadasok.OrderBy(x => x.EloadasVege).ToList(); }
                        if (sort.Member == "EloadasVege" && sort.SortDirection == ListSortDirection.Descending)
                        { LResult = lEloadasok.OrderByDescending(x => x.EloadasVege).ToList(); }

                        if (sort.Member == "EloadasNev" && sort.SortDirection == ListSortDirection.Ascending)
                        { LResult = lEloadasok.OrderBy(x => x.EloadasNev).ToList(); }
                        if (sort.Member == "EloadasNev" && sort.SortDirection == ListSortDirection.Descending)
                        { LResult = lEloadasok.OrderByDescending(x => x.EloadasNev).ToList(); }

                        if (sort.Member == "Helyszin" && sort.SortDirection == ListSortDirection.Ascending)
                        { LResult = lEloadasok.OrderBy(x => x.Helyszin).ToList(); }
                        if (sort.Member == "Helyszin" && sort.SortDirection == ListSortDirection.Descending)
                        { LResult = lEloadasok.OrderByDescending(x => x.Helyszin).ToList(); }

                        if (sort.Member == "SzervezetNev" && sort.SortDirection == ListSortDirection.Ascending)
                        { LResult = lEloadasok.OrderBy(x => x.SzervezetNev).ToList(); }
                        if (sort.Member == "SzervezetNev" && sort.SortDirection == ListSortDirection.Descending)
                        { LResult = lEloadasok.OrderByDescending(x => x.SzervezetNev).ToList(); }
                    }
                    else
                    {
                        LResult = lEloadasok.ToList();
                    }

                    var cnt = LResult.Count;
                    var result = LResult.ToDataSourceResult();
                    result.Total = cnt;
                    result.Data = GetPage(LResult, request.Page, request.PageSize, cnt);

                    return result;
                }

                return new DataSourceResult();
            }
            catch
            {
                return new DataSourceResult();
            }

        }

        public DataSourceResult GetEloadasokGondviseloGrid(string data, [System.Web.Http.ModelBinding.ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            try
            {
                EloadasokSearchModel model = JsonConvert.DeserializeObject<EloadasokSearchModel>(data);
                List<EloadasokGridModel> lEloadasok = new List<EloadasokGridModel>();
                List<EloadasokGridModel> LResult = new List<EloadasokGridModel>();
                model.EvfolyamIdList = new List<int>();
                model.IntezmenyAzonosito = ClaimData.IntezmenyAzonosito;

                if (model.EvfolyamID.HasValue)
                {
                    model.EvfolyamIdList.Add(model.EvfolyamID.Value);
                }
                else
                {
                    if (!model.IsMindenEvfolyamJog)
                    {
                        foreach (var item in new OsztalyCsoportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetLEPOszlyCspoortByTanevAndFelhasznalo(ClaimData.FelhasznaloId))
                        {
                            model.EvfolyamIdList.Add(item.EvfolyamTipusa);
                        }
                    }
                }

                var client = new LepClient(LepConfiguration.Url, LepConfiguration.ApiKey);
                var kozpontiResult = client.GetEloadasok(ClaimData.IntezmenyAzonosito, model.EvfolyamIdList);

                if (kozpontiResult != null)
                {
                    var groupedResult = kozpontiResult.GroupBy(x => (x.Id, x.IranyitoSzam, x.Telepules, x.KozteruletNev, x.KozteruletJellegNev, x.Hazszam, x.Kezdete, x.Vege, x.SzervezetNev, x.Nev, x.Leiras)).ToDictionary(x => x.Key, x => (EvfolyamIdList: x.Select(y => y.Evfolyam).ToList(), Ferohelyek: x.Select(y => (FerohelyMax: y.KiseroLetszam + y.TanuloLetszam, JelentkezokSzama: (y.KiseroJelentkezokSzama ?? 0) + (y.TanuloJelentkezokSzama ?? 0))).Distinct().Single(), EngedelyezettLetszamok: x.Select(y => (KiseroLetszam: y.KiseroLetszam, TanuloLetszam: y.TanuloLetszam)).Distinct().Single()));
                    foreach (var item in groupedResult)
                    {
                        if (item.Value.EvfolyamIdList.Intersect(Core.Constants.LepEnabledEvfolyam).Any())
                        {
                            lEloadasok.Add(new EloadasokGridModel()
                            {
                                ID = $"{item.Key.Id}",
                                Helyszin = $"{item.Key.IranyitoSzam} {item.Key.Telepules} {item.Key.KozteruletNev} {item.Key.KozteruletJellegNev} {item.Key.Hazszam}",
                                Datum = item.Key.Kezdete.Date,
                                EloadasKezdete = item.Key.Kezdete,
                                EloadasVege = item.Key.Vege,
                                SzervezetNev = item.Key.SzervezetNev,
                                EloadasNev = item.Key.Nev,
                                FerohelyFoglaltHelyek = $"{item.Value.Ferohelyek.FerohelyMax} / {item.Value.Ferohelyek.JelentkezokSzama}",
                                EvFolyamIdList = string.Join(",", item.Value.EvfolyamIdList),
                                KiseroLetszam = item.Value.EngedelyezettLetszamok.KiseroLetszam,
                                TanuloLetszam = item.Value.EngedelyezettLetszamok.TanuloLetszam,
                            });
                        }
                    }
                }

                var eHelper = new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                var tanuloEloadas = eHelper.GetTanuloEloadasai(ClaimData.FelhasznaloId);
                List<EloadasokGridModel> removableList = new List<EloadasokGridModel>();

                foreach (DataRow item in tanuloEloadas.Tables[0].Rows)
                {
                    var removable = lEloadasok.Where(x => x.ID == (item.Field<int>("EloadasId")).ToString()).FirstOrDefault();
                    removableList.Add(removable);
                }

                lEloadasok.RemoveAll(item => !removableList.Contains(item));

                foreach (var item in lEloadasok)
                {
                    foreach (DataRow row in tanuloEloadas.Tables[0].Rows)
                    {
                        if (item.ID == (row.Field<int>("EloadasId")).ToString())
                        {
                            item.GondviseloElfogadas = row.Field<string>("GondviseloElfogadas");
                            item.Megjelent = row.Field<string>("Megjelent_BNAME");
                        }
                    }
                }

                if (!string.IsNullOrWhiteSpace(model.EloadasNev))
                    lEloadasok = lEloadasok.Where(x => x.EloadasNev.ToLower().Contains(model.EloadasNev.ToLower())).ToList();

                if (!string.IsNullOrWhiteSpace(model.Helyszin))
                    lEloadasok = lEloadasok.Where(x => x.Helyszin.ToLower().Contains(model.Helyszin.ToLower())).ToList();

                if (model.EvfolyamID.HasValue)
                    lEloadasok = lEloadasok.Where(x => x.EvFolyamIdList.Contains(model.EvfolyamID.Value.ToString())).ToList();

                if (model.IdoszakKezdete.HasValue || model.IdoszakVege.HasValue)
                {
                    if (model.IdoszakKezdete.HasValue && model.IdoszakVege.HasValue)
                        lEloadasok = lEloadasok.Where(x => x.Datum >= model.IdoszakKezdete && x.Datum <= model.IdoszakVege).ToList();

                    if (model.IdoszakKezdete.HasValue && !model.IdoszakVege.HasValue)
                        lEloadasok = lEloadasok.Where(x => x.Datum >= model.IdoszakKezdete).ToList();

                    if (!model.IdoszakKezdete.HasValue && model.IdoszakVege.HasValue)
                        lEloadasok = lEloadasok.Where(x => x.Datum <= model.IdoszakVege).ToList();
                }

                if (!string.IsNullOrWhiteSpace(model.SzervezetNev))
                    lEloadasok = lEloadasok.Where(x => x.SzervezetNev.ToLower().Contains(model.SzervezetNev.ToLower())).ToList();

                if (model.IdoszakKezdeteTime.HasValue)
                    lEloadasok = lEloadasok.Where(x => x.EloadasKezdete.Value.TimeOfDay == model.IdoszakKezdeteTime.Value.TimeOfDay).ToList();

                if (model.IdoszakVegeTime.HasValue)
                    lEloadasok = lEloadasok.Where(x => x.EloadasVege.Value.TimeOfDay == model.IdoszakVegeTime.Value.TimeOfDay).ToList();

                if (lEloadasok.Count > 0)
                {
                    if (request.Sorts.Count == 1)
                    {
                        var sort = request.Sorts[0];
                        if (sort.Member == "Datum" && sort.SortDirection == ListSortDirection.Ascending)
                        { LResult = lEloadasok.OrderBy(x => x.Datum).ToList(); }
                        if (sort.Member == "Datum" && sort.SortDirection == ListSortDirection.Descending)
                        { LResult = lEloadasok.OrderByDescending(x => x.Datum).ToList(); }

                        if (sort.Member == "EloadasKezdete" && sort.SortDirection == ListSortDirection.Ascending)
                        { LResult = lEloadasok.OrderBy(x => x.EloadasKezdete).ToList(); }
                        if (sort.Member == "EloadasKezdete" && sort.SortDirection == ListSortDirection.Descending)
                        { LResult = lEloadasok.OrderByDescending(x => x.EloadasKezdete).ToList(); }

                        if (sort.Member == "EloadasVege" && sort.SortDirection == ListSortDirection.Ascending)
                        { LResult = lEloadasok.OrderBy(x => x.EloadasVege).ToList(); }
                        if (sort.Member == "EloadasVege" && sort.SortDirection == ListSortDirection.Descending)
                        { LResult = lEloadasok.OrderByDescending(x => x.EloadasVege).ToList(); }

                        if (sort.Member == "EloadasNev" && sort.SortDirection == ListSortDirection.Ascending)
                        { LResult = lEloadasok.OrderBy(x => x.EloadasNev).ToList(); }
                        if (sort.Member == "EloadasNev" && sort.SortDirection == ListSortDirection.Descending)
                        { LResult = lEloadasok.OrderByDescending(x => x.EloadasNev).ToList(); }

                        if (sort.Member == "Helyszin" && sort.SortDirection == ListSortDirection.Ascending)
                        { LResult = lEloadasok.OrderBy(x => x.Helyszin).ToList(); }
                        if (sort.Member == "Helyszin" && sort.SortDirection == ListSortDirection.Descending)
                        { LResult = lEloadasok.OrderByDescending(x => x.Helyszin).ToList(); }

                        if (sort.Member == "SzervezetNev" && sort.SortDirection == ListSortDirection.Ascending)
                        { LResult = lEloadasok.OrderBy(x => x.SzervezetNev).ToList(); }
                        if (sort.Member == "SzervezetNev" && sort.SortDirection == ListSortDirection.Descending)
                        { LResult = lEloadasok.OrderByDescending(x => x.SzervezetNev).ToList(); }
                    }
                    else
                    {
                        LResult = lEloadasok.ToList();
                    }

                    var cnt = LResult.Count;
                    var result = LResult.ToDataSourceResult();
                    result.Total = cnt;
                    result.Data = GetPage(LResult, request.Page, request.PageSize, cnt);

                    return result;
                }

                return new DataSourceResult();
            }
            catch
            {
                return new DataSourceResult();
            }
        }

        List<EloadasokGridModel> GetPage(List<EloadasokGridModel> list, int page, int pageSize, int fullCnt)
        {
            page--;
            return list.Skip(page * pageSize).Take(pageSize).ToList();
        }

        public DataSourceResult GetEloadasokDetailGrid(string data, [System.Web.Mvc.ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var model = JsonConvert.DeserializeObject<EloadasokDetailModel>(data);
            var id = int.Parse(model.ID);
            var helper = new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var result = helper.GetEloadasJegyzekek(id, ClaimData.FelhasznaloId, model.IsMindenEvfolyamJog, model.Datum.Value, model.EvFolyamId, model.SzervezetNev, model.EloadasNev, model.EloadasKezdete.Value, model.EloadasVege.Value, model.Helyszin);

            return result.ToDataSourceResult();
        }

        public JsonResult<List<SelectListItem>> GetTanulokForEloadas(int? eloadasId = null, int? evfolyamId = null, string filter = null, string isMindenEvfolyamJog = null)
        {
            var list = new List<SelectListItem>();

            if (eloadasId.HasValue && evfolyamId.HasValue)
            {
                var helper = new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                DataSet ds = helper.GetTanulokForEloadas(eloadasId.Value, evfolyamId.Value, filter, !string.IsNullOrWhiteSpace(isMindenEvfolyamJog) && SDAConvert.ToBoolean(isMindenEvfolyamJog) == false ? ClaimData.FelhasznaloId : (int?)null);

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    list.AddRange(ds.Tables[0].AsEnumerable().Select(dataRow => new SelectListItem
                    {
                        Value = dataRow.Field<int>("TanuloId").ToString(),
                        Text = dataRow.Field<string>("TanuloNev").ToString(),
                        Selected = false
                    }).ToList());
                }
            }

            return Json(list);
        }

        public JsonResult<List<SelectListItem>> GetTanulokForOsztaly(int? eloadasId = null, int? evfolyamId = null, string filter = null, string isMindenEvfolyamJog = null)
        {
            var list = new List<SelectListItem>();

            if (eloadasId.HasValue && evfolyamId.HasValue && filter != null)
            {
                var helper = new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                DataSet ds = helper.GetTanulokForOsztaly(int.Parse(filter));

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    list.AddRange(ds.Tables[0].AsEnumerable().Select(dataRow => new SelectListItem
                    {
                        Value = dataRow.Field<int>("TanuloId").ToString(),
                        Text = dataRow.Field<string>("TanuloNyomtatasiNev").ToString(),
                        Selected = false
                    }).ToList());
                }
            }

            return Json(list);
        }

        public JsonResult<(List<SelectListItem>, List<SelectListItem>)> GetOsztalyokForEloadas(int? eloadasId = null, int? evfolyamId = null, string isMindenEvfolyamJog = null)
        {
            var list = new List<SelectListItem>();
            var jelentkezettOsztalyList = new List<SelectListItem>();

            if (eloadasId.HasValue && evfolyamId.HasValue)
            {
                var helper = new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType());
                DataSet ds = helper.GetOsztalyokForEloadas(eloadasId.Value, evfolyamId.Value, !string.IsNullOrWhiteSpace(isMindenEvfolyamJog) && SDAConvert.ToBoolean(isMindenEvfolyamJog) == false ? ClaimData.FelhasznaloId : (int?)null);
                DataSet jelentkezettOsztalyok = helper.GetJelentkeztetettOsztalyokIdForEloadas(eloadasId.Value, !string.IsNullOrWhiteSpace(isMindenEvfolyamJog) && SDAConvert.ToBoolean(isMindenEvfolyamJog) == false ? ClaimData.FelhasznaloId : (int?)null);

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    list.AddRange(ds.Tables[0].AsEnumerable().Select(dataRow => new SelectListItem
                    {
                        Value = dataRow.Field<int>("Id").ToString(),
                        Text = dataRow.Field<string>("Nev").ToString(),
                        Selected = false
                    }).ToList());
                }

                if (jelentkezettOsztalyok.Tables.Count > 0 && jelentkezettOsztalyok.Tables[0].Rows.Count > 0)
                {
                    var jelentkezettOsztalyokIdList = jelentkezettOsztalyok.Tables[0].AsEnumerable().Select(datarow => datarow.Field<int>("ID").ToString());
                    jelentkezettOsztalyList.AddRange(list.Where(x => jelentkezettOsztalyokIdList.Contains(x.Value)).ToList());
                }
            }

            return Json((list, jelentkezettOsztalyList));
        }

        public JsonResult<List<SelectListItem>> GetEvfolyamokForEloadas(int? eloadasId = null, string evfolyamIdList = null, string isMindenEvfolyamJog = null)
        {
            var list = new List<SelectListItem>();

            if (eloadasId.HasValue && !string.IsNullOrWhiteSpace(evfolyamIdList))
            {
                var evfolyamIds = evfolyamIdList.Split(",".ToCharArray());
                list.AddRange(evfolyamIds.Select(x => new SelectListItem { Value = x, Text = ((EvfolyamTipusEnum)int.Parse(x)).GetDisplayName(ClaimData.SelectedTanevID.Value) }));
            }

            return Json(list);
        }

        [System.Web.Http.HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveTanulokForEloadas(EloadasTanuloSaveModel model)
        {
            var id = int.Parse(model.eloadasId);
            var helper = new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            var dbSzamossag = helper.GetEloadasSzamok(id);
            var dbTanuloSzam = dbSzamossag.Tables[0].Rows[0].Field<int>("TanuloSzam");
            var tanuloSzam = model.tanuIds != null ? model.tanuIds.Length + dbTanuloSzam : 0 + dbTanuloSzam;
            var kiseroSzam = model.kiseroSzam;

            string errors = string.Empty;
            if (model.TanuloLetszamFennmarado.HasValue && (model.tanuIds?.Length ?? 0) > model.TanuloLetszamFennmarado.Value)
            {
                errors += string.Format("{0}<br/>", EloadasokResource.AFoglaltHelyekSzamaMeghaladjaATanuloKeretszamot);
            }

            if (model.kiseroSzam > model.KiseroLetszam)
            {
                errors += EloadasokResource.AFoglaltHelyekSzamaMeghaladjaAKiseroKeretszamot;
            }

            if (!string.IsNullOrWhiteSpace(errors))
            {
                throw new StatusError(HttpStatusCode.BadRequest, errors);
            }

            var client = new LepClient(LepConfiguration.Url, LepConfiguration.ApiKey);
            var kozpontiResult = client.PostEloadasokTanuloszamossag(ClaimData.IntezmenyAzonosito, id, tanuloSzam, kiseroSzam);

            if (kozpontiResult.Sikeres)
            {
                helper.SaveTanulokEloadas(id, model.tanuIds, model.kiseroSzam);

                var ds = helper.GetTanulokForEloadasWithMegjelent(id, model.idopont);
                try
                {
                    client.PostEloadasokTanulojelenlet(ClaimData.IntezmenyAzonosito, id, ds);
                }
                catch { }

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            else
            {
                throw new StatusError(HttpStatusCode.BadRequest, kozpontiResult.StatuszUzenet);
            }
        }

        [System.Web.Http.HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteTanulokForEloadasByOsztaly(DeleteModel model)
        {
            var id = int.Parse(model.eloadasId);
            var helper = new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var row = helper.GetEloadasSzamok(id).Tables[0].Rows[0];
            var dbTanuloSzam = row.Field<int>("TanuloSzam");
            var dbKiseroSzam = row.Field<int>("KiseroSzam");
            int torlendoTanuloSzam = helper.GetTorlendoTanuloSzam(id, model.osztalyId);
            int kiseroSzam = (dbTanuloSzam - torlendoTanuloSzam) == 0 ? 0 : dbKiseroSzam;

            var client = new LepClient(LepConfiguration.Url, LepConfiguration.ApiKey);
            var kozpontiResult = client.PostEloadasokTanuloszamossag(ClaimData.IntezmenyAzonosito, id, dbTanuloSzam - torlendoTanuloSzam, dbKiseroSzam);

            if (kozpontiResult.Sikeres)
            {
                helper.DeleteTanulokForEloadasByOsztaly(id, model.osztalyId);
                if (kiseroSzam == 0)
                {
                    helper.UpdateEloadasKiseroSzam(id, kiseroSzam);
                }

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            else
            {
                throw new StatusError(HttpStatusCode.BadRequest, kozpontiResult.StatuszUzenet);
            }
        }

        [System.Web.Http.HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveGondviseloEngedelyezes(GVEngedelyModel model)
        {
            var id = int.Parse(model.eloadasId);
            var helper = new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            helper.SaveGondviseloEngedelyezes(id, model.tanuloId, ClaimData.GondviseloId.Value, model.engedelyezve == true ? "T" : model.engedelyezve == false ? "F" : "");

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [System.Web.Http.HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveTanulokMegjelent(List<MegjelentDataModel> listModel)
        {
            var helper = new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            foreach (var item in listModel)
            {
                if (item.Id.HasValue)
                {
                    helper.SaveTanulokMegjelent(item.Id.Value, item.Megjelent);
                }
            }

            var ds = helper.GetTanulokForEloadasWithMegjelent(listModel[0].EloadasId, listModel[0].EloadasDatum);
            var client = new LepClient(LepConfiguration.Url, LepConfiguration.ApiKey);
            try
            {
                var kozpontiResult = client.PostEloadasokTanulojelenlet(ClaimData.IntezmenyAzonosito, listModel[0].EloadasId, ds);
                if (!kozpontiResult.Sikeres)
                {
                    throw new StatusError(HttpStatusCode.BadRequest, kozpontiResult.StatuszUzenet);
                }
            }
            catch (Exception ex)
            {
                throw;
            }

            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        [System.Web.Http.HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public string DeleteTanulokForEloadas(int Id, string eloadasId, string szervNev, string eloadasNev, DateTime idopont, DateTime kezdete, DateTime vege)
        {
            var id = int.Parse(eloadasId);
            var helper = new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            var dataRow = helper.GetEloadasSzamok(id).Tables[0].Rows[0];
            int tanuloSzam = dataRow.Field<int>("TanuloSzam") - 1;
            int kiseroSzam = tanuloSzam == 0 ? 0 : dataRow.Field<int>("KiseroSzam");

            var client = new LepClient(LepConfiguration.Url, LepConfiguration.ApiKey);
            var kozpontiResult = client.PostEloadasokTanuloszamossag(ClaimData.IntezmenyAzonosito, id, tanuloSzam, kiseroSzam);

            if (kozpontiResult.Sikeres)
            {
                helper.DeleteTanuloEloadas(Id);
                if (kiseroSzam == 0)
                {
                    helper.UpdateEloadasKiseroSzam(id, kiseroSzam);
                }
            }
            else
            {
                throw new StatusError(HttpStatusCode.BadRequest, kozpontiResult.StatuszUzenet);
            }

            return eloadasId;
        }

        private void SendEmailLEPJelentkezes(int eloadasId, string[] tanuloIds, int dbTanuloSzam, string szervNev, string eloadasNev, string idopont, string kezdete, string vege)
        {
            var helper = new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            var emailList = helper.GetEloadasJelentkezesEmailData(eloadasId);

            foreach (DataRow item in emailList.Tables[0].Rows)
            {
                if ((tanuloIds != null && tanuloIds.Length > 0 && tanuloIds.Contains(item.Field<int>("TanuloId").ToString())) || dbTanuloSzam == 0)
                {
                    var uzenetHelper = new UzenetekHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
                    var emailMsg = string.Format(EmailResource.LEPJelentkezesContent,
                        item.Field<string>("Nev"),
                        item.Field<string>("TanuloNev"),
                        item.Field<string>("TanuloOsztalyNev"),
                        item.Field<string>("IntezmenyNev"),
                        szervNev,
                        eloadasNev,
                        idopont,
                        kezdete,
                        vege,
                        item.Field<string>("IntezmenyEmail")
                    );
                    //uzenetHelper.EmailKuldes(emailMsg, EmailResource.LEPJelentkezesSubject, item.Field<string>("EmailCim"), ClaimData.IntezmenyAzonosito);
                }
            }
        }

        private void SendEmailLEPTorles(int eloadasJegyzesId, string szervNev, string eloadasNev, string idopont, string kezdete, string vege)
        {
            var helper = new LepEloadasJegyzekHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            var emailList = helper.GetEloadasLemondasEmailData(eloadasJegyzesId);

            foreach (DataRow item in emailList.Tables[0].Rows)
            {
                var uzenetHelper = new UzenetekHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
                var emailMsg = string.Format(EmailResource.LEPTorlesContent,
                        item.Field<string>("Nev"),
                        item.Field<string>("TanuloNev"),
                        item.Field<string>("TanuloOsztalyNev"),
                        item.Field<string>("IntezmenyNev"),
                        szervNev,
                        eloadasNev,
                        idopont,
                        kezdete,
                        vege,
                        item.Field<string>("IntezmenyEmail")
                    );
                //uzenetHelper.EmailKuldes(emailMsg, EmailResource.LEPTorlesSubject, item.Field<string>("EmailCim"), ClaimData.IntezmenyAzonosito);
            }
        }
    }
}