using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Kreta.BusinessLogic.Classes;
using Kreta.BusinessLogic.Exceptions;
using Kreta.BusinessLogic.HelperClasses;
using Kreta.BusinessLogic.Utils;
using Kreta.Core;
using Kreta.Core.ConnectionType;
using Kreta.Core.Exceptions;
using Kreta.DataAccess.Interfaces;
using Kreta.DataAccessManual;
using Kreta.DataAccessManual.Interfaces;
using Kreta.DataAccessManual.Util;
using Kreta.Enums;
using Kreta.Resources;

namespace Kreta.BusinessLogic.Helpers
{
    public class OsztalyHelper : LogicBase
    {
        public OsztalyHelper(IConnectionType connectionType) : base(connectionType) { }

        public DataSet GetSZMKOsztalyok(int gondviseloId)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var dal = h.EugyintezesDal();
                return dal.GetSZMKOsztalyok(gondviseloId);
            });
        }

        public OsztalyCO GetClassById(int id)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly();
                var entity = dal.Get(id);
                var co = ConvertEntityToCo(entity, h);

                co.HasTanuloBesorolas = h.OsztalyCsoport().HasTanuloBesorolas(id);

                return co;
            });
        }

        public void InsertCo(OsztalyCO co)
        {
            Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly();
                var entity = dal.Get();
                ConvertToNewEntity(entity, co);
                entity.TanevId = TanevId;
                entity.FeladatKategoriaId = new FeladatEllatasiHelyHelper(new DalHandlerConnectionType(ConnectionType, h)).GetFeladatKategoriaId(co.FeladatEllatasiHelyId);
                dal.Insert(entity);
            });

        }

        public void UpdateCo(OsztalyCO co)
        {
            Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly();
                var entity = dal.Get(co.Id);

                if (entity.FeladatEllatasiHelyId != co.FeladatEllatasiHelyId)
                {
                    var helper = new FeladatEllatasiHelyHelper(new DalHandlerConnectionType(ConnectionType, h));
                    var dictionary = helper.GetFeladatEllatasiHelyDDl(string.Empty, (int)OktNevelesiKategoriaEnum.NevelesOktatas);
                    var feladatEllatasiHelyIdMegtalalhato = dictionary.Keys.Any(x => x == entity.FeladatEllatasiHelyId.ToString());

                    if (feladatEllatasiHelyIdMegtalalhato)
                    {
                        if (!new FeladatEllatasiHelyHelper(new DalHandlerConnectionType(ConnectionType, h)).IsAzonosKategoria(entity.FeladatEllatasiHelyId, co.FeladatEllatasiHelyId) && h.OsztalyCsoport().HasTanuloBesorolas(co.Id, true))
                        {
                            throw new BlException(OsztalyCsoportResource.FeladatellatasiHelyNemModosithatoMertVanTanuloBesorolva);
                        }
                    }
                }

                var kapcsolodoOsztalybontottCsoportokUpdate = (
                    entity.EvfolyamTipusa != co.EvfolyamTipusa
                    || entity.VegzosEvfolyam != co.VegzosEvfolyam
                    || entity.Keresztfeleves != co.Keresztfeleves
                    || entity.FeladatEllatasiHelyId != co.FeladatEllatasiHelyId
                    || entity.OsztalyFonokId != co.OsztalyfonokId
                    || entity.KepzesiForma != co.KepzesiForma
                    || entity.IsTechnikai != co.TechnikaiOsztaly
                );

                var osztalyTanuloiUpdateSzakkepzesesAdatokNeeded = co.SzakmacsoportId.HasValue
                                                                    || co.AgazatId.HasValue
                                                                    || co.SzakkepesitesId.HasValue
                                                                    || co.ReszSzakkepesitesId.HasValue;

                var osztalyTanuloiUpdateSzakkepzoJuttatasAdatokNeeded = new IntezmenyHelper(new DalHandlerConnectionType(ConnectionType, h)).GetIntezmenyiAdatok().IsSzakkepzoJuttatas;

                var felhelyHelper = new FeladatEllatasiHelyHelper(new DalHandlerConnectionType(ConnectionType, h));
                var elozoFelhelyIsSzakkepzeses = felhelyHelper.IsSzakkepzeses(entity.FeladatEllatasiHelyId);
                var ujFelhelyIsSzakkepzeses = felhelyHelper.IsSzakkepzeses(co.FeladatEllatasiHelyId);

                var juttatasUpdateNeeded = entity.JogviszonyTipusId != co.JogviszonyTipusId
                    || entity.EvfolyamTipusa != co.EvfolyamTipusa
                    || entity.IsTechnikai != co.TechnikaiOsztaly
                    || entity.Keresztfeleves != co.Keresztfeleves
                    || elozoFelhelyIsSzakkepzeses != ujFelhelyIsSzakkepzeses
                    || entity.VegzosEvfolyam != co.VegzosEvfolyam;

                var isOrarendUpdateNeeded = (entity.VegzosEvfolyam != co.VegzosEvfolyam
                    || entity.Keresztfeleves != co.Keresztfeleves) && entity.OrarendiOra.Count > 0;

                ConvertToUpdateEntity(h, entity, co);

                if (kapcsolodoOsztalybontottCsoportokUpdate)
                {
                    KapcsolodoOsztalybontottCsoportokUpdate(h, entity, isOrarendUpdateNeeded);
                }

                if (osztalyTanuloiUpdateSzakkepzesesAdatokNeeded)
                {
                    var szakkepzeseAdatok = new SzakkepzesesAdatokCO
                    {
                        Szakmacsoport = entity.SzakmaCsoport,
                        Agazat = entity.Agazat,
                        Szakkepesites = entity.Szakkepesites,
                        Reszszakkepesites = entity.Reszszakkepesites
                    };

                    SetSzakkepzesesAdatokNaToNull(szakkepzeseAdatok);
                    dal.UpdateOsztalyTanuloiSzakkepzesesAdatok(entity.ID, szakkepzeseAdatok.ConvertToPCO());
                }

                if (elozoFelhelyIsSzakkepzeses && !ujFelhelyIsSzakkepzeses)
                {
                    dal.UpdateOsztalyTanuloiReszszakepzesAdatokToNull(entity.ID, TanevId, IntezmenyId, FelhasznaloId);
                }

                if (osztalyTanuloiUpdateSzakkepzoJuttatasAdatokNeeded)
                {
                    dal.FullUpdate(entity);
                    if (juttatasUpdateNeeded)
                    {
                        var osztalyTanuloiIdList = entity.Tanulo.Where(x => !x.Torolt && (!x.KilepesDatum.HasValue || (x.KilepesDatum.Value >= DateTime.Today))).Select(tcs => tcs.TanuloId).ToList();
                        var juttatasDal = h.JuttatasDAL();
                        juttatasDal.UpdateTanulokSzakkepzesiJuttatasok(entity.TanevId, FelhasznaloId, (int)JuttatasTipusEnum.szakkepzesi_juttatas, tanulokIdString: string.Join(",", osztalyTanuloiIdList));
                        juttatasDal.UpdateTanulokSzakkepzesiJuttatasok(entity.TanevId, FelhasznaloId, (int)JuttatasTipusEnum.apaczaiosztondij, tanulokIdString: string.Join(",", osztalyTanuloiIdList));
                    }
                    return;
                }
                dal.FullUpdate(entity);
            });
        }

        private void KapcsolodoOsztalybontottCsoportokUpdate(IDalHandler h, IOsztaly entity, bool isOrarendUpdateNeeded)
        {
            var csoportDal = h.Csoport();
            var orarendDal = h.OrarendiOra();
            foreach (var osztalybontottcsoport in entity.CsoportBontasok)
            {
                osztalybontottcsoport.EvfolyamTipusa = entity.EvfolyamTipusa;
                osztalybontottcsoport.VegzosEvfolyam = entity.VegzosEvfolyam;
                osztalybontottcsoport.Keresztfeleves = entity.Keresztfeleves;
                osztalybontottcsoport.FeladatEllatasiHelyId = entity.FeladatEllatasiHelyId;
                osztalybontottcsoport.KepzesiForma = entity.KepzesiForma;
                osztalybontottcsoport.FeladatKategoriaId = new FeladatEllatasiHelyHelper(new DalHandlerConnectionType(ConnectionType, h)).GetFeladatKategoriaId(entity.FeladatEllatasiHelyId);
                osztalybontottcsoport.IsTechnikai = entity.IsTechnikai;

                if (osztalybontottcsoport.IsAutoEgyeniCsoport)
                {
                    osztalybontottcsoport.CsoportVezetoId = entity.OsztalyFonokId;
                }

                csoportDal.Update(osztalybontottcsoport);
                if (isOrarendUpdateNeeded)
                {
                    orarendDal.UpdateOrarend(IntezmenyId, TanevId, null, null, null, osztalybontottcsoport.ID);
                }
            }
        }

        private void SetSzakkepzesesAdatokNaToNull(SzakkepzesesAdatokCO szakkepzesesAdatok)
        {
            if (szakkepzesesAdatok.Szakmacsoport == (int)SzakmacsoportTipusEnum.Na)
            {
                szakkepzesesAdatok.Szakmacsoport = null;
            }
            if (szakkepzesesAdatok.Agazat == (int)AgazatTipusEnum.Na)
            {
                szakkepzesesAdatok.Agazat = null;
            }
            if (szakkepzesesAdatok.Szakkepesites == (int)SzakkepesitesTipusEnum.Na)
            {
                szakkepzesesAdatok.Szakkepesites = null;
            }
            if (szakkepzesesAdatok.Reszszakkepesites == (int)ReszszakkepesitesTipusEnum.Na)
            {
                szakkepzesesAdatok.Reszszakkepesites = null;
            }
        }

        public string DeleteClass(int id, bool csoportokTorlese, int felhasznaloId, bool updateTanoraEvesSorszam)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var tanmenetHelper = new TanmenetHelper(new DalHandlerConnectionType(ConnectionType, h));
                var dal = h.Osztaly();
                var entity = dal.Get(id);
                var tanuloOsztalyNev = entity.Nev;

                if (h.OsztalyCsoport().HasTanuloBesorolas(id))
                {
                    throw new CannotBeDeletedException(string.Format(ErrorResource.Az0OsztalyCsoportNemTorolthetoMertKapcsolodikVagyKapcsolodottHozzaTanulo, tanuloOsztalyNev));
                }

                foreach (var tanmenetId in entity.Tanmenet.Where(x => !x.Torolt).Select(x => x.ID).ToList())
                {
                    tanmenetHelper.DeleteTanmenet(tanmenetId);
                }

                // TODO: Átgondolni, a Csoport entitás Osztalybontás és az Osztály CsoportBontasok, illetve az Osztaly_Csoportok kapcsolótáblát, mert redundás tárolásnak tünik és össze vissza van használva.
                //       Elméletileg nem lehet egy csoportnak több osztálya(felületről biztos nem lehet állítani), ezért a kapcsolótábla indokolalannak tűnik.
                //       https://jira.ekreta.hu/browse/KRETA-2817

                var osztalyCsoport = new OsztalyCsoportHelper(new DalHandlerConnectionType(ConnectionType, h));

                if (!osztalyCsoport.HasTanitasiOra(id))
                {
                    var orarendiOraDal = h.OrarendiOra();
                    var orarendiOraList = entity.OrarendiOra.Where(x => !x.Torolt).ToList();

                    orarendiOraList.ForEach(x => orarendiOraDal.Delete(x.ID));
                }

                var csoportDal = h.Csoport();
                var csoportHelper = new CsoportHelper(new DalHandlerConnectionType(ConnectionType, h));
                var csoportbontasok = entity.CsoportBontasok.Where(cs => !cs.Torolt).ToList();

                if (csoportokTorlese)
                {
                    csoportbontasok.ForEach(x => csoportHelper.DeleteGroupById(x.ID));
                }
                else
                {
                    csoportbontasok.ForEach(x => csoportDal.SetOsztalyBontasIdToNull(x.ID, felhasznaloId, TanevId));
                }

                dal.Delete(entity, IntezmenyId, TanevId, updateTanoraEvesSorszam);
                return tanuloOsztalyNev;
            });
        }

        public DataSet OsztalyExport(OsztalySearchCo co)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                DateTime tanevElsoTanitasiNapja = new TanevHelper(new DalHandlerConnectionType(ConnectionType, h)).GetTanevKezdete();
                var dal = h.Osztaly(GridParameters);
                var ds = dal.OsztalyExport(co.ConvertToPco(), TanevId, tanevElsoTanitasiNapja);
                return ds;
            });
        }

        public string UpdateOsztalyTobbes(OsztalyTobbesModCO co)
        {
            if (!co.ID.HasValue)
            {
                throw new BlException(ErrorResource.NemLetezoOsztaly);
            }

            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var osztalyTanuloiUpdateSzakkepzesesAdatokNeeded = false;

                var dal = h.Osztaly();
                var entity = dal.Get(co.ID.Value);

                var kapcsolodoOsztalybontottCsoportokUpdate = (
                    co.Evfolyam.HasValue && entity.EvfolyamTipusa != co.Evfolyam
                    || co.VegzosEvf.HasValue && entity.VegzosEvfolyam != co.VegzosEvf.ToBool()
                    || co.Keresztfeleves.HasValue && entity.Keresztfeleves != co.Keresztfeleves.ToBool()
                    || co.FeladatellatasiHely.HasValue && entity.FeladatEllatasiHelyId != co.FeladatellatasiHely
                );

                var isOrarendUpdateNeeded = (entity.VegzosEvfolyam != co.VegzosEvf.ToBool()
                    || entity.Keresztfeleves != co.Keresztfeleves.ToBool()) && entity.OrarendiOra.Count > 0;

                var juttatasUpdateNeeded = (co.Evfolyam.HasValue && (entity.EvfolyamTipusa != co.Evfolyam))
                    || (co.JogviszonyTipusId.HasValue && (entity.JogviszonyTipusId != co.JogviszonyTipusId))
                    || (co.VegzosEvf.HasValue && (entity.VegzosEvfolyam != co.VegzosEvf.ToBool()))
                    || (co.Keresztfeleves.HasValue && (entity.Keresztfeleves != co.Keresztfeleves.ToBool()))
                    || (co.TechnikaiOsztaly.HasValue && (entity.IsTechnikai != co.TechnikaiOsztaly.ToBool()));

                if (co.FeladatellatasiHely.HasValue)
                {
                    var felhelyHelper = new FeladatEllatasiHelyHelper(new DalHandlerConnectionType(ConnectionType, h));
                    var elozoFelhelyIsSzakkepzeses = felhelyHelper.IsSzakkepzeses(entity.FeladatEllatasiHelyId);
                    var ujFelhelyIsSzakkepzeses = felhelyHelper.IsSzakkepzeses(co.FeladatellatasiHely.Value);

                    juttatasUpdateNeeded = juttatasUpdateNeeded
                        || (elozoFelhelyIsSzakkepzeses != ujFelhelyIsSzakkepzeses);
                }

                var osztalyTanuloiUpdateSzakkepzoJuttatasAdatokNeeded = new IntezmenyHelper(new DalHandlerConnectionType(ConnectionType, h)).GetIntezmenyiAdatok().IsSzakkepzoJuttatas;

                if (co.Evfolyam.HasValue)
                {
                    entity.EvfolyamTipusa = co.Evfolyam.Value;
                }
                if (co.FeladatellatasiHely.HasValue)
                {
                    if (entity.FeladatEllatasiHelyId != co.FeladatellatasiHely.Value && !new FeladatEllatasiHelyHelper(new DalHandlerConnectionType(ConnectionType, h)).IsAzonosKategoria(entity.FeladatEllatasiHelyId, co.FeladatellatasiHely.Value) && h.OsztalyCsoport().HasTanuloBesorolas(co.ID.Value, true))
                    {
                        return entity.Nev;
                    }

                    entity.FeladatEllatasiHelyId = co.FeladatellatasiHely.Value;
                    entity.FeladatKategoriaId = new FeladatEllatasiHelyHelper(new DalHandlerConnectionType(ConnectionType, h)).GetFeladatKategoriaId(co.FeladatellatasiHely.Value);
                }
                if (co.KepzesiForma.HasValue)
                {
                    entity.KepzesiForma = co.KepzesiForma.Value;
                }
                if (co.Tanterv.HasValue)
                {
                    entity.TantervId = co.Tanterv.Value;
                }

                if (co.VegzosEvf.HasValue)
                {
                    entity.VegzosEvfolyam = co.VegzosEvf.ToBool();
                }

                if (co.Keresztfeleves.HasValue)
                {
                    entity.Keresztfeleves = co.Keresztfeleves.ToBool();
                }

                if (co.TechnikaiOsztaly.HasValue)
                {
                    entity.IsTechnikai = co.TechnikaiOsztaly.ToBool();
                }

                if (co.TervezettLetszam.HasValue)
                {
                    entity.TervezettLetszam = co.TervezettLetszam;
                }

                if (co.Nemzetisegi.HasValue)
                {
                    entity.Nemzetisegi = co.Nemzetisegi.ToBool();
                }

                //if (co.Gyogypedagogiai.HasValue)
                //{
                //    entity.Gyogypedagogiai = co.Gyogypedagogiai.ToBool();
                //    entity.SpecialisJellemzo = co.SpecialisJellemzo;
                //}

                if (co.Kettannyelvu.HasValue)
                {
                    entity.Kettannyelvu = co.Kettannyelvu.ToBool();
                }

                if (co.NyelviElokeszito.HasValue)
                {
                    entity.NyelviElokeszito = co.NyelviElokeszito.ToBool();
                }

                if (co.IsGyogypedagogiaiLogopediai.HasValue)
                {
                    entity.IsGyogypedagogiaiLogopediai = co.IsGyogypedagogiaiLogopediai.ToBool();
                }

                if (co.AJAlProgram.HasValue)
                {
                    entity.AranyJanosProgramTipusId = co.AJAlProgram.Value;
                }

                //if (co.Gyogypedagogiai.HasValue)
                //{
                //    entity.Gyogypedagogiai = co.Gyogypedagogiai.ToBool();
                //    entity.SpecialisJellemzo = co.SpecialisJellemzo;
                //}

                if (co.SzakmacsoportId.HasValue)
                {
                    entity.SzakmaCsoport = co.SzakmacsoportId.Value;
                    osztalyTanuloiUpdateSzakkepzesesAdatokNeeded = true;
                }
                if (co.AgazatId.HasValue)
                {
                    entity.Agazat = co.AgazatId.Value;
                    osztalyTanuloiUpdateSzakkepzesesAdatokNeeded = true;
                }
                if (co.SzakkepesitesId.HasValue)
                {
                    entity.Szakkepesites = co.SzakkepesitesId.Value;
                    osztalyTanuloiUpdateSzakkepzesesAdatokNeeded = true;
                }
                if (co.ReszSzakkepesitesId.HasValue)
                {
                    entity.Reszszakkepesites = co.ReszSzakkepesitesId.Value;
                    osztalyTanuloiUpdateSzakkepzesesAdatokNeeded = true;
                }

                if (co.AgazatUjSzktTipusId.HasValue)
                {
                    entity.AgazatUjSzktTipusId = co.AgazatUjSzktTipusId.Value;
                }
                if (co.SzakmaTipusId.HasValue)
                {
                    entity.SzakmaTipusId = co.SzakmaTipusId.Value;
                }
                if (co.SzakmairanyTipusId.HasValue)
                {
                    entity.SzakmairanyTipusId = co.SzakmairanyTipusId.Value;
                }
                if (co.SzakiranyNktTipusId.HasValue)
                {
                    entity.SzakiranyNktTipusId = co.SzakiranyNktTipusId.Value;
                }
                if (co.SzakkepesitesNktTipusId.HasValue)
                {
                    entity.SzakkepesitesNktTipusId = co.SzakkepesitesNktTipusId.Value;
                }
                if (co.TanulmanyiTeruletNktTipusId.HasValue)
                {
                    entity.TanulmanyiTeruletNktTipusId = co.TanulmanyiTeruletNktTipusId.Value;
                }

                //if (co.AJTehettseggondozoProgram.HasValue)
                //{
                //    entity.AJTehettseggondozoProgram = co.AJTehettseggondozoProgram.ToBool();
                //}

                if (co.GimnaziumiEvfolyamTipusId.HasValue)
                {
                    entity.GimnaziumiEvfolyamTipusId = co.GimnaziumiEvfolyamTipusId.Value;
                }

                if (co.Sport.HasValue)
                {
                    entity.Sport = co.Sport.ToBool();
                }

                if (co.AJProgram.HasValue)
                {
                    entity.AJProgram = co.AJProgram.ToBool();
                }

                if (co.MuveszetiAgId.HasValue)
                {
                    entity.MuveszetiAgId = co.MuveszetiAgId.Value;
                }
                if (co.MufajTipusId.HasValue)
                {
                    entity.MufajTipusId = co.MufajTipusId.Value;
                }
                if (co.TanszakTipusId.HasValue)
                {
                    entity.TanszakTipusId = co.TanszakTipusId.Value;
                }

                if (co.ZenemuveszetiAgTipusId.HasValue)
                {
                    entity.ZenemuveszetiAgTipusId = co.ZenemuveszetiAgTipusId.Value;
                }

                if (osztalyTanuloiUpdateSzakkepzesesAdatokNeeded)
                {
                    var szakkepzeseAdatok = new SzakkepzesesAdatokCO
                    {
                        Szakmacsoport = entity.SzakmaCsoport,
                        Agazat = entity.Agazat,
                        Szakkepesites = entity.Szakkepesites,
                        Reszszakkepesites = entity.Reszszakkepesites
                    };

                    SetSzakkepzesesAdatokNaToNull(szakkepzeseAdatok);
                    dal.UpdateOsztalyTanuloiSzakkepzesesAdatok(entity.ID, szakkepzeseAdatok.ConvertToPCO());
                }

                if (co.OsztalynaploMegnyitasDatuma.HasValue)
                {
                    entity.OsztalynaploMegnyitasa = co.OsztalynaploMegnyitasDatuma.Value;
                }

                if (co.OsztalynaploLezarasDatuma.HasValue)
                {
                    entity.OsztalynaploZarasa = co.OsztalynaploLezarasDatuma.Value;
                }

                if (kapcsolodoOsztalybontottCsoportokUpdate)
                {
                    KapcsolodoOsztalybontottCsoportokUpdate(h, entity, isOrarendUpdateNeeded);
                }

                entity.JogviszonyTipusId = co.JogviszonyTipusId;

                if (co.OsztalyFonok.HasValue)
                {
                    entity.OsztalyFonokId = co.OsztalyFonok.Value;
                }
                if (co.OsztalyFonokHelyettes.HasValue)
                {
                    entity.OfoHelyettesId = co.OsztalyFonokHelyettes.Value;
                }
                if (co.Terem.HasValue)
                {
                    entity.TeremId = co.Terem.Value;
                }

                if (osztalyTanuloiUpdateSzakkepzoJuttatasAdatokNeeded)
                {
                    dal.FullUpdate(entity);
                    if (juttatasUpdateNeeded)
                    {
                        var osztalyTanuloiIdList = entity.Tanulo.Where(x => !x.Torolt && (!x.KilepesDatum.HasValue || (x.KilepesDatum.Value >= DateTime.Today))).Select(tcs => tcs.TanuloId).ToList();
                        var juttatasDal = h.JuttatasDAL();
                        juttatasDal.UpdateTanulokSzakkepzesiJuttatasok(entity.TanevId, FelhasznaloId, (int)JuttatasTipusEnum.szakkepzesi_juttatas, tanulokIdString: string.Join(",", osztalyTanuloiIdList));
                        juttatasDal.UpdateTanulokSzakkepzesiJuttatasok(entity.TanevId, FelhasznaloId, (int)JuttatasTipusEnum.apaczaiosztondij, tanulokIdString: string.Join(",", osztalyTanuloiIdList));
                    }
                    return null;
                }

                dal.FullUpdate(entity);
                return null;
            });
        }

        private DataSet SearchClass(OsztalySearchCo co)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly(GridParameters);
                var ds = dal.OsztalyKereses(co.ConvertToPco(), TanevId);

                return ds;
            });
        }

        public int GetOsztalyfonokByOsztalyId(int osztalyId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly();
                return dal.GetOsztalyfonokByOsztalyId(osztalyId);
            });
        }

        public IDictionary<string, string> GetOsztalyokByTanev(string baseText, int? feladatKategoriaId = null)
        {
            var result = Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly();
                return dal.GetOsztalyokByTanevForDDL(TanevId, feladatKategoriaId);
            });

            return LogicUtil.CreateDropdownContent(result, "ID", "Nev", baseText, sort: false);
        }

        public IDictionary<string, string> GetOnlyOsztalyok(string baseText = null, int? tanarId = null, OktNevelesiKategoriaEnum? feladatKategoriaId = null, int? customTanevId = null, bool forSzirStatTanulo = false)
        {
            var result = Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var tanevId = customTanevId.HasValue ? customTanevId.Value : TanevId;

                var dal = h.Osztaly();
                return dal.GetOnlyOsztalyokForDDL(tanevId, tanarId, feladatKategoriaId, forSzirStatTanulo);
            });

            return LogicUtil.CreateDropdownContent(result, "ID", "Nev", baseText, sort: false);
        }

        private void ConvertToUpdateEntity(IDalHandler h, IOsztaly entity, OsztalyCO co)
        {
            entity.Nev = co.OsztalyNev;
            entity.Megjegyzes = co.Megjegyzes;
            entity.VegzosEvfolyam = co.VegzosEvfolyam;
            entity.EvfolyamTipusa = co.EvfolyamTipusa;

            if (co.TeremID.HasValue)
            {
                entity.TeremId = co.TeremID.Value;
            }
            else
            {
                entity.Terem = null;
            }
            if (co.KepzesiForma.HasValue)
            {
                entity.KepzesiForma = co.KepzesiForma.Value;
            }

            if (co.OsztalyfonokId.HasValue && co.OsztalyfonokId > 0)
            {
                entity.OsztalyFonokId = co.OsztalyfonokId.Value;
            }
            else
            {
                entity.OsztalyFonok = null;
            }
            if (co.OsztalyfonokHelyettesId.HasValue && co.OsztalyfonokHelyettesId > 0)
            {
                entity.OfoHelyettesId = (int)co.OsztalyfonokHelyettesId;
            }
            else
            {
                entity.OfoHelyettes = null;
            }
            if (co.TantervId.HasValue && co.TantervId > 0)
            {
                entity.TantervId = co.TantervId.Value;
            }
            else
            {
                entity.Tanterv = null;
            }
            if (co.FeladatEllatasiHelyId > 0)
            {
                entity.FeladatEllatasiHelyId = co.FeladatEllatasiHelyId;
                entity.FeladatKategoriaId = new FeladatEllatasiHelyHelper(new DalHandlerConnectionType(ConnectionType, h)).GetFeladatKategoriaId(co.FeladatEllatasiHelyId);
            }
            else
            {
                entity.FeladatEllatasiHely = null;
            }

            if (co.OsztalynaploMegnyitasa.HasValue)
            {
                entity.OsztalynaploMegnyitasa = co.OsztalynaploMegnyitasa.Value;
            }
            else
            {
                entity.OsztalynaploMegnyitasa = null;
            }

            if (co.OsztalynaploLezarasa.HasValue)
            {
                entity.OsztalynaploZarasa = co.OsztalynaploLezarasa.Value;
            }
            else
            {
                entity.OsztalynaploZarasa = null;
            }

            if (co.SzuloiMunkakozossegKepviseloId.HasValue && co.SzuloiMunkakozossegKepviseloId > 0)
            {
                entity.SZMKKepviseloId = co.SzuloiMunkakozossegKepviseloId.Value;
            }
            else
            {
                entity.SZMKKepviselo = null;
            }

            if (co.SzuloiMunkakozossegKepviseloHelyettesId.HasValue && co.SzuloiMunkakozossegKepviseloHelyettesId > 0)
            {
                entity.SZMKKepviseloHelyettesId = co.SzuloiMunkakozossegKepviseloHelyettesId.Value;
            }
            else
            {
                entity.SZMKKepviseloHelyettes = null;
            }

            if (co.SzuloiMunkakozossegKepviseloHelyettesId.HasValue && co.SzuloiMunkakozossegKepviseloHelyettesId > 0)
            {
                entity.SZMKKepviseloHelyettesId = co.SzuloiMunkakozossegKepviseloHelyettesId.Value;
            }
            else
            {
                entity.SZMKKepviseloHelyettes = null;
            }

            if (co.AJAlProgram.HasValue && co.AJAlProgram > 0)
            {
                entity.AranyJanosProgramTipusId = co.AJAlProgram.Value;
            }
            else
            {
                entity.AranyJanosProgramTipusId = null;
            }

            entity.OsztalypenzBankszamlaszama = co.OsztalypenzBankszamlaszama;
            entity.OsztalypenzBankszamlaszamKedvezmenyezettNeve = co.OsztalypenzBankszamlaszamKedvezmenyezett;

            entity.GimnaziumiEvfolyamTipusId = co.GimnaziumiEvfolyamTipusId.HasValue ? co.GimnaziumiEvfolyamTipusId : null;

            entity.OsztalynaploLeirasa = co.OsztalynaploLeirasa;
            entity.Naploszam = co.Naploszam;

            entity.Keresztfeleves = co.Keresztfeleves;
            entity.IsTechnikai = co.TechnikaiOsztaly;
            entity.TervezettLetszam = co.TervezettLetszam;
            entity.Nemzetisegi = co.Nemzetisegi;
            entity.Kettannyelvu = co.Kettannyelvu;
            entity.NyelviElokeszito = co.NyelviElokeszito;
            entity.IsGyogypedagogiaiLogopediai = co.IsGyogypedagogiaiLogopediai;
            entity.Sport = co.Sport;

            entity.SzakmaCsoport = co.SzakmacsoportId ?? (int)SzakmacsoportTipusEnum.Na;
            entity.Agazat = co.AgazatId ?? (int)AgazatTipusEnum.Na;
            entity.Szakkepesites = co.SzakkepesitesId ?? (int)SzakkepesitesTipusEnum.Na;
            entity.Reszszakkepesites = co.ReszSzakkepesitesId ?? (int)ReszszakkepesitesTipusEnum.Na;

            entity.AgazatUjSzktTipusId = co.AgazatUjSzktTipusId ?? (int)AgazatUjSzktTipusEnum.na;
            entity.SzakmaTipusId = co.SzakmaTipusId ?? (int)SzakmaTipusEnum.na;
            entity.SzakmairanyTipusId = co.SzakmairanyTipusId ?? (int)SzakmairanyTipusEnum.na;

            entity.SzakiranyNktTipusId = co.SzakiranyNktTipusId ?? (int)SzakiranyNktTipusEnum.na;
            entity.SzakkepesitesNktTipusId = co.SzakkepesitesNktTipusId ?? (int)SzakkepesitesNktTipusEnum.na;
            entity.TanulmanyiTeruletNktTipusId = co.TanulmanyiTeruletNktTipusId ?? (int)TanulmanyiTeruletNktTipusEnum.na;

            entity.JogviszonyTipusId = co.JogviszonyTipusId;

            entity.AJProgram = co.AJProgram;
            //entity.AJTehettseggondozoProgram = co.AJTehettseggondozoProgram;
            entity.SpecialisJellemzo = co.SpecialisJellemzo;

            entity.MuveszetiAgId = co.MuveszetiAgId;
            entity.TanszakTipusId = co.TanszakTipusId;
            entity.MufajTipusId = co.MufajTipusId;
        }

        private void ConvertToNewEntity(IOsztaly entity, OsztalyCO co)
        {
            entity.Nev = co.OsztalyNev;
            entity.Megjegyzes = co.Megjegyzes;
            entity.VegzosEvfolyam = co.VegzosEvfolyam;
            if (co.TeremID.HasValue)
                entity.TeremId = co.TeremID.Value;
            if (co.KepzesiForma.HasValue)
                entity.KepzesiForma = co.KepzesiForma.Value;
            entity.EvfolyamTipusa = co.EvfolyamTipusa;
            if (co.OsztalyfonokId.HasValue && co.OsztalyfonokId > 0)
                entity.OsztalyFonokId = co.OsztalyfonokId.Value;
            if (co.OsztalyfonokHelyettesId != null && co.OsztalyfonokHelyettesId > 0)
                entity.OfoHelyettesId = co.OsztalyfonokHelyettesId.Value;
            if (co.TantervId.HasValue && co.TantervId > 0)
                entity.TantervId = co.TantervId.Value;
            if (co.FeladatEllatasiHelyId > 0)
                entity.FeladatEllatasiHelyId = co.FeladatEllatasiHelyId;
            if (co.OsztalynaploMegnyitasa.HasValue)
                entity.OsztalynaploMegnyitasa = co.OsztalynaploMegnyitasa.Value;
            if (co.OsztalynaploLezarasa.HasValue)
                entity.OsztalynaploZarasa = co.OsztalynaploLezarasa.Value;
            if (!string.IsNullOrWhiteSpace(co.OsztalynaploLeirasa))
                entity.OsztalynaploLeirasa = co.OsztalynaploLeirasa;
            entity.Naploszam = co.Naploszam;

            entity.Keresztfeleves = co.Keresztfeleves;
            entity.IsTechnikai = co.TechnikaiOsztaly;
            entity.TervezettLetszam = co.TervezettLetszam;
            entity.Nemzetisegi = co.Nemzetisegi;
            entity.Kettannyelvu = co.Kettannyelvu;
            entity.NyelviElokeszito = co.NyelviElokeszito;
            entity.IsGyogypedagogiaiLogopediai = co.IsGyogypedagogiaiLogopediai;
            entity.Sport = co.Sport;
            entity.AJProgram = co.AJProgram;
            //entity.AJTehettseggondozoProgram = co.AJTehettseggondozoProgram;
            entity.SpecialisJellemzo = co.SpecialisJellemzo;
            entity.MuveszetiAgId = co.MuveszetiAgId;

            if (co.GimnaziumiEvfolyamTipusId.HasValue)
            {
                entity.GimnaziumiEvfolyamTipusId = co.GimnaziumiEvfolyamTipusId;
            }

            entity.SzakmaCsoport = co.SzakmacsoportId ?? (int)SzakmacsoportTipusEnum.Na;
            entity.Agazat = co.AgazatId ?? (int)AgazatTipusEnum.Na;
            entity.Szakkepesites = co.SzakkepesitesId ?? (int)SzakkepesitesTipusEnum.Na;
            entity.Reszszakkepesites = co.ReszSzakkepesitesId ?? (int)ReszszakkepesitesTipusEnum.Na;

            entity.AgazatUjSzktTipusId = co.AgazatUjSzktTipusId ?? (int)AgazatUjSzktTipusEnum.na;
            entity.SzakmaTipusId = co.SzakmaTipusId ?? (int)SzakmaTipusEnum.na;
            entity.SzakmairanyTipusId = co.SzakmairanyTipusId ?? (int)SzakmairanyTipusEnum.na;

            entity.SzakiranyNktTipusId = co.SzakiranyNktTipusId ?? (int)SzakiranyNktTipusEnum.na;
            entity.SzakkepesitesNktTipusId = co.SzakkepesitesNktTipusId ?? (int)SzakkepesitesNktTipusEnum.na;
            entity.TanulmanyiTeruletNktTipusId = co.TanulmanyiTeruletNktTipusId ?? (int)TanulmanyiTeruletNktTipusEnum.na;

            entity.JogviszonyTipusId = co.JogviszonyTipusId;

            if (co.AJAlProgram.HasValue)
            {
                entity.AranyJanosProgramTipusId = co.AJAlProgram.Value;
            }
            entity.MuveszetiAgId = co.MuveszetiAgId;
            entity.MufajTipusId = co.MufajTipusId;
            entity.TanszakTipusId = co.TanszakTipusId;
        }

        /// INFO @DevKornel: Mobil használja
        public OsztalyCO ConvertEntityToCo(IOsztaly entity, IDalHandler h)
        {
            var co = new OsztalyCO();
            co.Id = entity.ID;
            co.OsztalyNev = entity.Nev;
            co.Megjegyzes = entity.Megjegyzes;
            co.VegzosEvfolyam = entity.VegzosEvfolyam;
            co.KepzesiForma = entity.KepzesiForma;
            co.EvfolyamTipusa = entity.EvfolyamTipusa > 0 ? entity.EvfolyamTipusa : (int)EvfolyamTipusEnum.na;
            co.OsztalyfonokId = entity.OsztalyFonokId > 0 ? entity.OsztalyFonokId : -1;
            co.OsztalyfonokHelyettesId = entity.OfoHelyettesId > 0 ? entity.OfoHelyettesId : -1;
            co.TantervId = entity.TantervId > 0 ? entity.TantervId : new int?();
            co.FeladatEllatasiHelyId = entity.FeladatEllatasiHelyId > 0 ? entity.FeladatEllatasiHelyId : 0;
            co.TeremID = entity.TeremId > 0 ? entity.TeremId : (int?)null;

            co.OsztalyfonokNev = entity.OsztalyFonokId > 0 ? entity.OsztalyFonok.NyomtatasiNev : "";
            co.OfoHelyettesNev = entity.OfoHelyettesId > 0 ? entity.OfoHelyettes.NyomtatasiNev : "";
            co.TanevNeve = entity.Tanev.Nev;
            co.TeremNev = entity.Terem != null ? entity.Terem.Nev : "";
            co.TantervNev = entity.TantervId > 0 ? entity.Tanterv.Nev : "";
            co.FeladatellatasiHelyNev = entity.FeladatEllatasiHely.MukodesiHely.Nev + " - " + entity.FeladatEllatasiHely.OktatasiNevelesiFeladatTipus.GetDisplayName<OktatasiNevelesiFeladatEnum>(TanevId);
            co.Keresztfeleves = entity.Keresztfeleves;
            co.SzakmacsoportId = entity.SzakmaCsoport;
            co.AgazatId = entity.Agazat;
            co.SzakkepesitesId = entity.Szakkepesites;
            co.ReszSzakkepesitesId = entity.Reszszakkepesites;
            co.AgazatUjSzktTipusId = entity.AgazatUjSzktTipusId;
            co.SzakmaTipusId = entity.SzakmaTipusId;
            co.SzakmairanyTipusId = entity.SzakmairanyTipusId;
            co.SzakiranyNktTipusId = entity.SzakiranyNktTipusId;
            co.SzakkepesitesNktTipusId = entity.SzakkepesitesNktTipusId;
            co.TanulmanyiTeruletNktTipusId = entity.TanulmanyiTeruletNktTipusId;
            co.TechnikaiOsztaly = entity.IsTechnikai;
            co.TervezettLetszam = entity.TervezettLetszam;
            co.Nemzetisegi = entity.Nemzetisegi;
            co.Kettannyelvu = entity.Kettannyelvu;
            co.NyelviElokeszito = entity.NyelviElokeszito;
            co.IsGyogypedagogiaiLogopediai = entity.IsGyogypedagogiaiLogopediai;
            co.GimnaziumiEvfolyamTipusId = entity.GimnaziumiEvfolyamTipusId;
            co.Sport = entity.Sport;
            co.AJProgram = entity.AJProgram;
            //co.AJTehettseggondozoProgram = entity.AJTehettseggondozoProgram;
            co.SpecialisJellemzo = entity.SpecialisJellemzo;
            co.MuveszetiAgId = entity.MuveszetiAgId;
            co.MufajTipusId = entity.MufajTipusId;
            co.TanszakTipusId = entity.TanszakTipusId;
            co.SzuloiMunkakozossegKepviseloId = entity.SZMKKepviseloId > 0 ? entity.SZMKKepviseloId : (int?)null;
            co.SzuloiMunkakozossegKepviselo = entity.SZMKKepviseloId > 0 ? entity.SZMKKepviselo.Nev : string.Empty;
            co.SzuloiMunkakozossegKepviseloHelyettesId = entity.SZMKKepviseloHelyettesId > 0 ? entity.SZMKKepviseloHelyettesId : (int?)null;
            co.SzuloiMunkakozossegKepviseloHelyettes = entity.SZMKKepviseloHelyettesId > 0 ? entity.SZMKKepviseloHelyettes.Nev : string.Empty;
            co.OsztalypenzBankszamlaszama = entity.OsztalypenzBankszamlaszama;
            co.OsztalypenzBankszamlaszamKedvezmenyezett = entity.OsztalypenzBankszamlaszamKedvezmenyezettNeve;
            co.JogviszonyTipusId = entity.JogviszonyTipusId;

            //Azok a tanulók, akiknél nincs kilépésdátuma, vagy az nagyobb, mint a jelenlegi dátum
            DateTime date = DateTime.Now;
            TanevHelper thelper = new TanevHelper(new DalHandlerConnectionType(ConnectionType, h));
            var tanev = thelper.GetTanevInfo();
            co.TanulokSzama = entity.Tanulo.Count(x => x.Torolt == false &&
                                        (!tanev.IsAktiv || (x.BelepesDatum != null && x.BelepesDatum <= date && (x.KilepesDatum == null || x.KilepesDatum > date))));
            if (entity.OsztalynaploMegnyitasa != null)
            { co.OsztalynaploMegnyitasa = entity.OsztalynaploMegnyitasa; }
            if (entity.OsztalynaploZarasa != null)
            { co.OsztalynaploLezarasa = entity.OsztalynaploZarasa; }
            if (entity.OsztalynaploLeirasa != null)
            { co.OsztalynaploLeirasa = entity.OsztalynaploLeirasa; }
            if (!string.IsNullOrWhiteSpace(entity.Naploszam))
            { co.Naploszam = entity.Naploszam; }

            co.AJAlProgram = entity.AranyJanosProgramTipusId;

            return co;
        }

        public SzakkepzesesAdatokCO GetOsztalyNKTesSZKTSzakkepzesesAdatok(int osztalyId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly();
                var szakkepzesesAdatok = new SzakkepzesesAdatokCO();
                var ds = dal.GetOsztalyNKTesSZKTSzakkepzesesAdatok(osztalyId);

                if (ds.Tables[0].Rows.Count > 0)
                {
                    var row = ds.Tables[0].Rows[0];
                    szakkepzesesAdatok.Szakmacsoport = row["Szakmacsoport"] == DBNull.Value ? null : (int?)row["Szakmacsoport"];
                    szakkepzesesAdatok.Agazat = row["Agazat"] == DBNull.Value ? null : (int?)row["Agazat"];
                    szakkepzesesAdatok.Szakkepesites = row["Szakkepesites"] == DBNull.Value ? null : (int?)row["Szakkepesites"];
                    szakkepzesesAdatok.Reszszakkepesites = row["Reszszakkepesites"] == DBNull.Value ? null : (int?)row["Reszszakkepesites"];
                    szakkepzesesAdatok.SzakiranyNKTTipusId = row["SzakiranyNKTTipus"] == DBNull.Value ? null : (int?)row["SzakiranyNKTTipus"];
                    szakkepzesesAdatok.SzakkepesitesNKTTipusId = row["SzakkepesitesNKTTipus"] == DBNull.Value ? null : (int?)row["SzakkepesitesNKTTipus"];
                    szakkepzesesAdatok.TanulmanyiTeruletNKTTipusId = row["TanulmanyiTeruletNKTTipus"] == DBNull.Value ? null : (int?)row["TanulmanyiTeruletNKTTipus"];
                }

                return szakkepzesesAdatok;
            });
        }

        public SzakkepzoAdatokCO GetOsztalySzakkepzoAdatok(int osztalyId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly();
                var szakkepzoAdatok = new SzakkepzoAdatokCO();
                var ds = dal.GetOsztalySzakkepzoAdatok(osztalyId);

                if (ds.Tables[0].Rows.Count > 0)
                {
                    var row = ds.Tables[0].Rows[0];
                    szakkepzoAdatok.JogviszonyTipus = row["Jogviszony"] == DBNull.Value ? null : (int?)row["Jogviszony"];
                }

                return szakkepzoAdatok;
            });
        }

        public List<OsztalyItemCo> GetOsztalyCoList()
        {
            DataSet dataSet = Dal.CustomConnection.Run(ConnectionType, dalHandler => dalHandler.Osztaly().GetOsztalyDataSet(TanevId));

            var result = new List<OsztalyItemCo>();
            foreach (DataRow dataRow in dataSet.Tables[0].Rows)
            {
                var item = new OsztalyItemCo(dataRow);
                result.Add(item);
            }

            return result;
        }

        public IDictionary<string, string> GetOsztalyokForDDL(string baseText = null, int? tanarId = null, bool? szuperOsztalyfonok = null, OktNevelesiKategoriaEnum? feladatKategoriaId = null)
        {
            var result = Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly();
                return dal.GetOsztalyokForDDL(TanevId, tanarId, szuperOsztalyfonok, feladatKategoriaId);
            });

            return LogicUtil.CreateDropdownContent(result, "ID", "Nev", baseText, sort: false);
        }

        public IDictionary<string, string> GetOsztalyokCsoportokForDDL(string baseText = null, int? tanarId = null, bool szuperOsztalyfonok = false)
        {
            var result = Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly();
                return dal.GetOsztalyokCsoportokForDDL(TanevId, tanarId, szuperOsztalyfonok);
            });

            return LogicUtil.CreateDropdownContent(result, "ID", "Nev", baseText, sort: false);
        }

        public List<OsztalyItemCo> GetOsztalyCoList(OsztalySearchCo osztalySearchCo)
        {
            var coList = new List<OsztalyItemCo>();

            var ds = SearchClass(osztalySearchCo);
            foreach (var row in ds.Tables[0].AsEnumerable())
            {
                coList.Add(new OsztalyItemCo(row));
            }
            return FilterOsztalyItemCoList(coList, osztalySearchCo);
        }

        private List<OsztalyItemCo> FilterOsztalyItemCoList(List<OsztalyItemCo> coList, OsztalySearchCo osztalySearchCo)
        {
            if (osztalySearchCo == null)
            {
                return coList;
            }

            IEnumerable<OsztalyItemCo> result = coList;
            if (osztalySearchCo.NincsEvfolyamJellmezo.HasValue && osztalySearchCo.NincsEvfolyamJellmezo.Value)
            {
                result = result.Where(x => x.EvfolyamId == (int)EvfolyamTipusEnum.na);
            }
            if (osztalySearchCo.NincsOsztalyfonok.HasValue && osztalySearchCo.NincsOsztalyfonok.Value)
            {
                result = result.Where(x => string.IsNullOrWhiteSpace(x.Osztalyfonok));
            }
            if (osztalySearchCo.UresOsztaly.HasValue)
            {
                // Note: TanulokSzamaOrder = TanulokSzama * 1000 + ArchivTanulokSzama  DB-ben igy kerul kiszamitasra!
                result = result.Where(x => x.TanulokSzamaOrder < 1000);
            }
            if (osztalySearchCo.FeladatKategoriaId.IsEntityId())
            {
                result = result.Where(x => x.FeladatKategoriaId == osztalySearchCo.FeladatKategoriaId.Value);
            }
            if (!string.IsNullOrWhiteSpace(osztalySearchCo.OsztalyNev))
            {
                result = result.Where(x => x.Nev.ToComparableString().Contains(osztalySearchCo.OsztalyNev.ToComparableString()));
            }
            if (osztalySearchCo.EvfolyamId.HasValue)
            {
                result = result.Where(x => x.EvfolyamId == osztalySearchCo.EvfolyamId.Value);
            }
            if (osztalySearchCo.OsztalyfonokId.HasValue)
            {
                result = result.Where(x => x.OsztalyfonokId == osztalySearchCo.OsztalyfonokId.Value);
            }
            if (osztalySearchCo.OsztalyfonokHelyettesId.HasValue)
            {
                result = result.Where(x => x.OsztalyfonokHelyettesId == osztalySearchCo.OsztalyfonokHelyettesId.Value);
            }
            if (osztalySearchCo.TeremId.HasValue)
            {
                result = result.Where(x => x.TeremId == osztalySearchCo.TeremId.Value);
            }
            if (osztalySearchCo.Vegzos.HasValue)
            {
                result = result.Where(x => x.VegzosEvfolyam_BNAME == (osztalySearchCo.Vegzos.Value == 1).GetDisplayName());
            }
            if (osztalySearchCo.KepzesId.HasValue)
            {
                result = result.Where(x => x.KepzesId == osztalySearchCo.KepzesId.Value);
            }
            if (osztalySearchCo.TantervId.HasValue)
            {
                result = result.Where(x => x.TantervId == osztalySearchCo.TantervId.Value);
            }
            /// TODO: ezt a szűrést át kell beszélni
            if (osztalySearchCo.NaploMegnyitasDatum.HasValue)
            {
                result = result.Where(x => x.NaploMegnyitasDatum >= osztalySearchCo.NaploMegnyitasDatum.Value);
            }
            if (osztalySearchCo.NaploLezarasDatum.HasValue)
            {
                result = result.Where(x => x.NaploLezarasDatum <= osztalySearchCo.NaploLezarasDatum.Value);
            }
            if (osztalySearchCo.FeladatEllatasiHelyId.HasValue)
            {
                result = result.Where(x => x.FeladatEllatasiHelyId == osztalySearchCo.FeladatEllatasiHelyId.Value);
            }
            if (osztalySearchCo.SearchMuveszetiAgId.HasValue)
            {
                result = result.Where(x => x.MuveszetiAgId == osztalySearchCo.SearchMuveszetiAgId.Value);
            }

            return result.ToList();
        }

        public List<OsztalyTanuloinakKepzesiJellemzoiItemCo> GetOsztalyTanuloinakKepzesiJellemzoi(int osztalyId, int jegyzekTipus, bool isAktivTanev)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly(GridParameters);
                var dataSet = dal.GetOsztalyTanuloinakKepzesiJellemzoi(TanevId, IntezmenyId, osztalyId, jegyzekTipus, isAktivTanev);

                var result = new List<OsztalyTanuloinakKepzesiJellemzoiItemCo>();
                foreach (DataRow dataRow in dataSet.Tables[0].Rows)
                {
                    var item = new OsztalyTanuloinakKepzesiJellemzoiItemCo(dataRow);
                    result.Add(item);
                }
                return result;
            });
        }

        public List<TanuloKepzesiJellemzoiItemCo> GetOsztalyTanuloiByKepzesiJellemzok(TanuloKepzesiJellemzoSearchCo co, bool isAktivTanev)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly(GridParameters);
                var dataSet = dal.GetOsztalyTanuloiByKepzesiJellemzok(co.ConvertToPco(), TanevId, IntezmenyId, isAktivTanev);

                var result = new List<TanuloKepzesiJellemzoiItemCo>();
                foreach (DataRow dataRow in dataSet.Tables[0].Rows)
                {
                    var item = new TanuloKepzesiJellemzoiItemCo(dataRow);
                    result.Add(item);
                }
                return result;
            });
        }

        public List<OsztalyCsoportTanuloMunkarendItemCo> GetOsztalyTanuloiByMunkarend(int osztalycsoportId, bool hasMunkarend, bool isAktivTanev)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly(GridParameters);
                var dataSet = dal.GetOsztalyTanuloiByMunkarend(osztalycsoportId, hasMunkarend, isAktivTanev);

                var result = new List<OsztalyCsoportTanuloMunkarendItemCo>();
                foreach (DataRow dataRow in dataSet.Tables[0].Rows)
                {
                    var item = new OsztalyCsoportTanuloMunkarendItemCo(dataRow);
                    result.Add(item);
                }
                return result;
            });
        }

        public (int SzktCount, int OkjCount, int NktCount, int UresCount, int ReszszakmaCount) GetOsztalyTanuloinakSzamaKepzesiJellemzokSzerint(int osztalyId, bool isAktivTanev)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly(GridParameters);
                var dataSet = dal.GetOsztalyTanuloinakSzamaKepzesiJellemzokSzerint(osztalyId, TanevId, IntezmenyId, isAktivTanev);
                var dataRow = dataSet.Tables[0].Rows[0];
                return (SzktCount: (int)dataRow[0], OkjCount: (int)dataRow[1], NktCount: (int)dataRow[2], UresCount: (int)dataRow[3], ReszszakmaCount: (int)dataRow[4]);
            });
        }

        public (int munkarenddelNemRendelkezo, int munkarenddelRendelkezo) GetOsztalyMunkarendSzama(int osztalyCsoportId, bool isAktivTanev)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Osztaly(GridParameters);
                var dataSet = dal.GetOsztalyMunkarendSzama(osztalyCsoportId, isAktivTanev);
                var dataRow = dataSet.Tables[0].Rows[0];
                return (munkarenddelNemRendelkezo: (int)dataRow[0], munkarenddelRendelkezo: (int)dataRow[1]);
            });
        }
    }
}