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.HelperClasses.NebuloBAI;
using Kreta.Core;
using Kreta.Core.ConnectionType;
using Kreta.DataAccess.Interfaces;
using Kreta.DataAccessManual;
using Kreta.DataAccessManual.Interfaces;
using Kreta.Enums;
using Kreta.Enums.ManualEnums;
using Kreta.Resources;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

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

        public DataSet GetNebuloListForGrid(NebuloSearchCo co)
        {
            var result = Dal.CustomConnection.Run(ConnectionType, h => h.Nebulo(GridParameters).GetNebuloListForGrid(co.ToPco()));

            SetNebuloGridKirSzinkronizacio(result);

            return result;
        }

        private void SetNebuloGridKirSzinkronizacio(DataSet ds)
        {
            var kirSzinkronizacioStatuszaColumnName = "KirSzinkronizacioStatusza";
            var kirKontenerElkuldesenekDatumaColumnName = "KirKontenerElkuldesenekDatuma";
            var kirKontenerElkuldesenekDatumaFormattedColumnName = "KirKontenerElkuldesenekDatumaFormatted";
            var kirKontenerElemStatuszUzenetColumnName = "KirKontenerElemStatuszUzenet";

            ds.Tables[0].Columns.Add(kirSzinkronizacioStatuszaColumnName, typeof(string));
            ds.Tables[0].Columns.Add(kirKontenerElkuldesenekDatumaFormattedColumnName, typeof(string));

            foreach (DataRow row in ds.Tables[0].Rows)
            {
                var kirStatuszValue = row["C_KIRSTATUSZ"].ToString();

                if (kirStatuszValue == ((int)KirKontenerUzenetEnums.RogzitettKontenerFeldolgozasraVar).ToString() ||
                    kirStatuszValue == ((int)KirKontenerUzenetEnums.DigSigEllenorzesreKuldhetoKontener).ToString() ||
                    kirStatuszValue == ((int)KirKontenerUzenetEnums.DigSigEllenorzesFolyamatbanVan).ToString() ||
                    kirStatuszValue == ((int)KirKontenerUzenetEnums.DigSigEllenorzesSikeres).ToString() ||
                    kirStatuszValue == ((int)KirKontenerUzenetEnums.EllenorzesreEsTovabbkuldesreVaroKontener).ToString() ||
                    kirStatuszValue == ((int)KirKontenerUzenetEnums.AKontenerTartalomAHatterRendszernekElkuldve).ToString() ||
                    kirStatuszValue == ((int)KirKontenerUzenetEnums.AHatterRendszerBefogadtaAKerelmet).ToString())
                {
                    row[kirSzinkronizacioStatuszaColumnName] = BeiratkozasResource.Folyamatban;
                }
                else if (kirStatuszValue == ((int)KirTanuloHibauzenetEnums.NemLetezoSzolgaltatas).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.IsmeretlenSzotarTipus).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.ToroltSzotarErtek).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.LejartSzotarErtek).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.HelytelenDatumFormatum).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.AzIntezmenyCsakSajatMaganakVehetFelTanuloiJogviszonyokat).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.NemJelenthetoBeSzolgaltatasiHelyNelkuliAktivJogviszony).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.HibasDatumAdatokATanuloiJogviszonyban).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.AJogviszonyKezdodatumaNemLehetKorabbiASzemelySzuletesiDatumanal).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.TanuloiJogviszonyEsetenLegalabbEgySzolgaltatasMegleteKotelezo).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.ASzolgaltatasIgenybevetelKezdodatumaNemEshetAJogviszonyIdotartalmanKivulre).ToString())
                {
                    row[kirSzinkronizacioStatuszaColumnName] = BeiratkozasResource.SzinkronHiba;
                }
                else if (kirStatuszValue == ((int)KirTanuloHibauzenetEnums.NemLetezoTanulo).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.ATanulohozLetezikMasikIdobenAtfedoJogviszonyEzzelAzOmkoddal).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.ATanulohozLetezikIdobenAtfedoTankotelesVagyOvodaiJogviszonyMasikIntezmennyel).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.NemAMegadottIntezmenyhezTartozoFeladatellatasiHely).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.ToroltFeladatellatasiHely).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.MegszuntFeladatellatasiHely).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.NemLetezoFeladatellatasiHely).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.NemLetezoIntezmeny).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.MegszuntIntezmeny).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.AKivalasztottEvfolyamNemKompatibilisASzolgaltatassal).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.AKivalasztottSzolgaltatastNemLatjaElAzIntezmeny).ToString() ||
                         kirStatuszValue == ((int)KirTanuloHibauzenetEnums.IsmeretlenHibaAzAdatfeldolgozasSoran).ToString())
                {
                    row[kirSzinkronizacioStatuszaColumnName] = BeiratkozasResource.Adathiba;
                }
                else if (kirStatuszValue == ((int)KirKontenerUzenetEnums.DigSigEllenorzesKotelezoDeNemAlairtAKontener).ToString() ||
                         kirStatuszValue == ((int)KirKontenerUzenetEnums.DigSigEllenorzesSikertelen).ToString() ||
                         kirStatuszValue == ((int)KirKontenerUzenetEnums.AKontenerTartalomXsdInvalid).ToString() ||
                         kirStatuszValue == ((int)KirKontenerUzenetEnums.AKontenerTartalomNemACelszolgaltatasnakMegfeleloTipus).ToString())
                {
                    row[kirSzinkronizacioStatuszaColumnName] = BeiratkozasResource.SzinkronHiba;
                }
                else if (kirStatuszValue == "KEZ")
                {
                    row[kirSzinkronizacioStatuszaColumnName] = BeiratkozasResource.Sikeres;
                    row[kirKontenerElemStatuszUzenetColumnName] = BeiratkozasResource.Sikeres;
                }
                else
                {
                    row[kirSzinkronizacioStatuszaColumnName] = BeiratkozasResource.Szinkronizalando;
                }

                if (row.IsNull(kirKontenerElkuldesenekDatumaColumnName))
                {
                    row[kirKontenerElkuldesenekDatumaFormattedColumnName] = "-";
                }
                else
                {
                    row[kirKontenerElkuldesenekDatumaFormattedColumnName] = Convert.ToDateTime(row[kirKontenerElkuldesenekDatumaColumnName]).ToString("yyyy-MM-dd HH:mm:ss");
                }
            }
        }

        public DataSet GetNebuloLetszamListForGrid()
        {
            var result = Dal.CustomConnection.Run(ConnectionType, h => h.Nebulo(GridParameters).GetNebuloOsszletszam());
            return result;
        }

        public void SaveNebulo(NebuloCo co)
        {
            Dal.CustomConnection.Run(ConnectionType, h =>
            {
                INebuloDal dal = h.Nebulo();
                bool isNew = !co.Id.IsEntityId();
                INebulo entity = isNew ? dal.Get() : dal.Get(co.Id.Value);

                entity.Elotag = co.Elotag.ReplaceMultipleSpacesAndTrim();
                entity.TanuloCsaladiNeve = co.Vezeteknev.ReplaceMultipleSpacesAndTrim();
                entity.TanuloUtoneve = co.Keresztnev.ReplaceMultipleSpacesAndTrim();
                entity.OktatasiAzonositoSzama = co.OktatasiAzonositoSzama.ReplaceMultipleSpacesAndTrim();
                entity.Neme = co.NemeId;

                entity.SzuletesiCsaladiNeve = co.SzuletesiVezeteknev.ReplaceMultipleSpacesAndTrim();
                entity.SzuletesiUtoneve = co.SzuletesiKeresztnev.ReplaceMultipleSpacesAndTrim();
                entity.SzuletesiOrszag = co.SzuletesiOrszagId.Value;
                entity.SzuletesiHely = co.SzuletesiHely.ReplaceMultipleSpacesAndTrim();
                entity.SzuletesiIdo = co.SzuletesiIdo.Value;

                entity.EdesanyjaSzuletesiCsaladiNeve = co.AnyjaVezetekneve.ReplaceMultipleSpacesAndTrim();
                entity.EdesanyjaSzuletesiUtoneve = co.AnyjaKeresztneve.ReplaceMultipleSpacesAndTrim();
                entity.Anyanyelve = co.AnyanyelvId;
                entity.Allampolgarsaga = co.AllampolgarsagId;
                entity.Allampolgarsaga2 = co.Allampolgarsag2Id;

                entity.OrszagTipusId = co.Orszag;
                entity.Iranyitoszam = co.Iranyitoszam.ReplaceMultipleSpacesAndTrim();
                entity.HelysegNev = co.Helyseg.ReplaceMultipleSpacesAndTrim();
                entity.KozteruletNev = co.KozteruletNev.ReplaceMultipleSpacesAndTrim();
                entity.KozteruletJellegeNev = co.KozteruletJellegNev.ReplaceMultipleSpacesAndTrim();
                entity.Hazszam = co.Hazszam.ReplaceMultipleSpacesAndTrim();
                entity.Emelet = co.Emelet.ReplaceMultipleSpacesAndTrim();
                entity.Ajto = co.Ajto.ReplaceMultipleSpacesAndTrim();
                entity.EugySzam = co.EugyUgyiratszam.ReplaceMultipleSpacesAndTrim();
                entity.Osztalya = co.Osztalya.ReplaceMultipleSpacesAndTrim();
                entity.Indoklas = co.Indoklas.ReplaceMultipleSpacesAndTrim();

                entity.HatarozatStatusz = co.EugyStatusz;
                entity.HatarozatDatuma = co.EugyStatuszDatum;

                entity.TartozkodasiHelyAzonos = co.THCimeAzonos;
                if (co.THCimeAzonos)
                {
                    entity.THOrszagTipusId = null;
                    entity.THIranyitoszam = null;
                    entity.THHelysegNev = null;
                    entity.THKozteruletNev = null;
                    entity.THKozteruletJellegeNev = null;
                    entity.THHazszam = null;
                    entity.THEmelet = null;
                    entity.THAjto = null;
                }
                else
                {
                    entity.THOrszagTipusId = co.THOrszag;
                    entity.THIranyitoszam = co.THIranyitoszam.ReplaceMultipleSpacesAndTrim();
                    entity.THHelysegNev = co.THHelyseg.ReplaceMultipleSpacesAndTrim();
                    entity.THKozteruletNev = co.THKozteruletNev.ReplaceMultipleSpacesAndTrim();
                    entity.THKozteruletJellegeNev = co.THKozteruletJellegNev.ReplaceMultipleSpacesAndTrim();
                    entity.THHazszam = co.THHazszam.ReplaceMultipleSpacesAndTrim();
                    entity.THEmelet = co.THEmelet.ReplaceMultipleSpacesAndTrim();
                    entity.THAjto = co.THAjto.ReplaceMultipleSpacesAndTrim();
                }

                entity.TKNeve = co.TKNev.ReplaceMultipleSpacesAndTrim();
                entity.TKRokonsagiFoka = co.TKRokonsagiFokId;
                entity.TKEmailCim = co.TKEmail.ReplaceMultipleSpacesAndTrim();
                entity.TKTelefon = co.TKTelefon.ReplaceMultipleSpacesAndTrim();

                entity.KepviseloCimeAzonos = co.TKCimeAzonos;
                if (co.TKCimeAzonos)
                {
                    entity.TKOrszagTipusId = null;
                    entity.TKIranyitoszam = null;
                    entity.TKHelysegNev = null;
                    entity.TKKozteruletNev = null;
                    entity.TKKozteruletJellegeNev = null;
                    entity.TKHazszam = null;
                    entity.TKEmelet = null;
                    entity.TKAjto = null;
                }
                else
                {
                    entity.TKOrszagTipusId = co.TKOrszag;
                    entity.TKIranyitoszam = co.TKIranyitoszam.ReplaceMultipleSpacesAndTrim();
                    entity.TKHelysegNev = co.TKHelyseg.ReplaceMultipleSpacesAndTrim();
                    entity.TKKozteruletNev = co.TKKozteruletNev.ReplaceMultipleSpacesAndTrim();
                    entity.TKKozteruletJellegeNev = co.TKKozteruletJellegNev.ReplaceMultipleSpacesAndTrim();
                    entity.TKHazszam = co.TKHazszam.ReplaceMultipleSpacesAndTrim();
                    entity.TKEmelet = co.TKEmelet.ReplaceMultipleSpacesAndTrim();
                    entity.TKAjto = co.TKAjto.ReplaceMultipleSpacesAndTrim();
                }

                entity.TKNeve2 = co.TKNev2.ReplaceMultipleSpacesAndTrim();
                entity.TKRokonsagiFoka2 = co.TKRokonsagiFok2Id;
                entity.TKEmailCim2 = co.TKEmail2.ReplaceMultipleSpacesAndTrim();
                entity.TKTelefon2 = co.TKTelefon2.ReplaceMultipleSpacesAndTrim();

                entity.Kepviselo2CimeAzonos = co.TKCimeAzonos2;
                if (co.TKCimeAzonos2)
                {
                    entity.TKOrszagTipusId2 = null;
                    entity.TKIranyitoszam2 = null;
                    entity.TKHelysegNev2 = null;
                    entity.TKKozteruletNev2 = null;
                    entity.TKKozteruletJellegeNev2 = null;
                    entity.TKHazszam2 = null;
                    entity.TKEmelet2 = null;
                    entity.TKAjto2 = null;
                }
                else
                {
                    entity.TKOrszagTipusId2 = co.TKOrszag2;
                    entity.TKIranyitoszam2 = co.TKIranyitoszam2.ReplaceMultipleSpacesAndTrim();
                    entity.TKHelysegNev2 = co.TKHelyseg2.ReplaceMultipleSpacesAndTrim();
                    entity.TKKozteruletNev2 = co.TKKozteruletNev2.ReplaceMultipleSpacesAndTrim();
                    entity.TKKozteruletJellegeNev2 = co.TKKozteruletJelleg2Nev.ReplaceMultipleSpacesAndTrim();
                    entity.TKHazszam2 = co.TKHazszam2.ReplaceMultipleSpacesAndTrim();
                    entity.TKEmelet2 = co.TKEmelet2.ReplaceMultipleSpacesAndTrim();
                    entity.TKAjto2 = co.TKAjto2.ReplaceMultipleSpacesAndTrim();
                }

                //entity.OvodaAzonosito = co.OvodaAzonosito.ReplaceMultipleSpacesAndTrim();
                //entity.OvodaNeve = co.OvodaNev.ReplaceMultipleSpacesAndTrim();
                if (co.FeladatellatasiHelyId != null)
                {
                    entity.FeladatEllatasiHelyId = co.FeladatellatasiHelyId.Value;
                }
                else if (entity.FeladatEllatasiHely != null)
                {
                    entity.FeladatEllatasiHely = null;
                }

                entity.KirSzolgaltatasTipusId = co.KirSzolgaltatasTipusId;
                entity.Tagozat = co.TagozatId;
                entity.EtikaHitErkolcstan = co.EtikaHitErkolcstanId;
                entity.Megjegyzes = co.Megjegyzes;
                entity.FelvetelStatusza = co.FelvetelStatuszaId;

                entity.EletvitelszeruOttLakasKorzetes = co.EletvitelszeruOttLakasKorzetes;
                entity.SzakertoiBizottsagKormanyhivatalAltalKijelolttanulo = co.SzakertoiBizottsagKormanyhivatalAltalKijelolttanulo;
                entity.SzulojeTestvereTartosanBetegVagyFogyatekkalElo = co.SzulojeTestvereTartosanBetegVagyFogyatekkalElo;
                entity.TestvereAzIntezmenyTanuloja = co.TestvereAzIntezmenyTanuloja;
                entity.SzulojenekMunkahelyeAzIskolaKorzetebenTalalhato = co.SzulojenekMunkahelyeAzIskolaKorzetebenTalalhato;
                entity.AzIskolaALakohelyetolEgyKilometerenBelulTalalhato = co.AzIskolaALakohelyetolEgyKilometerenBelulTalalhato;
                entity.IsOsszevontOsztalyba = co.IsOsszevontOsztaly;
                entity.SNI = co.SNI;
                if (co.SNI != null && co.SNI.Value)
                {
                    entity.SNILetszamSuly = co.SNILetszamSuly;
                }
                else
                {
                    entity.SNILetszamSuly = 1;
                }
                entity.BTM = co.BTM;
                if (co.BTM != null && co.BTM.Value)
                {
                    entity.BTMLetszamSuly = co.BTMLetszamSuly;
                }
                else
                {
                    entity.BTMLetszamSuly = 1;
                }

                if (entity.KirStatusz == ((int)KirTanuloHibauzenetEnums.NemLetezoTanulo).ToString() ||
                    entity.KirStatusz == ((int)KirTanuloHibauzenetEnums.ATanulohozLetezikMasikIdobenAtfedoJogviszonyEzzelAzOmkoddal).ToString() ||
                    entity.KirStatusz == ((int)KirTanuloHibauzenetEnums.ATanulohozLetezikIdobenAtfedoTankotelesVagyOvodaiJogviszonyMasikIntezmennyel).ToString() ||
                    entity.KirStatusz == ((int)KirTanuloHibauzenetEnums.NemAMegadottIntezmenyhezTartozoFeladatellatasiHely).ToString() ||
                    entity.KirStatusz == ((int)KirTanuloHibauzenetEnums.ToroltFeladatellatasiHely).ToString() ||
                    entity.KirStatusz == ((int)KirTanuloHibauzenetEnums.MegszuntFeladatellatasiHely).ToString() ||
                    entity.KirStatusz == ((int)KirTanuloHibauzenetEnums.NemLetezoFeladatellatasiHely).ToString() ||
                    entity.KirStatusz == ((int)KirTanuloHibauzenetEnums.NemLetezoIntezmeny).ToString() ||
                    entity.KirStatusz == ((int)KirTanuloHibauzenetEnums.MegszuntIntezmeny).ToString() ||
                    entity.KirStatusz == ((int)KirTanuloHibauzenetEnums.AKivalasztottEvfolyamNemKompatibilisASzolgaltatassal).ToString() ||
                    entity.KirStatusz == ((int)KirTanuloHibauzenetEnums.AKivalasztottSzolgaltatastNemLatjaElAzIntezmeny).ToString() ||
                    entity.KirStatusz == ((int)KirTanuloHibauzenetEnums.IsmeretlenHibaAzAdatfeldolgozasSoran).ToString())
                {
                    entity.KirStatusz = null;
                }

                if (co.FelvetelStatuszaId == (int)FelvetelStatuszaTipusEnum.NemFelveve || co.FelvetelStatuszaId == (int)FelvetelStatuszaTipusEnum.OvodabanMaradt ||
                    co.FelvetelStatuszaId == (int)FelvetelStatuszaTipusEnum.MasIntezmenybeFelveve || co.FelvetelStatuszaId == (int)FelvetelStatuszaTipusEnum.BeiratkozasVisszavonva)
                {
                    entity.IsKozpontiMegjelent = false;
                }

                #region 2021
                entity.TKSzuletesiNev = co.TKSzuletesiNev;
                entity.TKSzuletesiNev2 = co.TK2SzuletesiNev;
                entity.TKJogalapTipusId = co.TKJogalap;
                entity.TKJogalapTipus2Id = co.TK2Jogalap;
                entity.OvodaiEvek = co.OvodaEvekSzama;
                //entity.IsNemMagyarOvoda = co.NemMagyarOvoda;
                entity.IsOktAzonNelkuli = co.NincsOktatasiAzonosito;
                entity.OktAzonIndoklas = co.NincsOktatasiAzonositoIndok;
                entity.FelekezetTipusId = co.Felekezet;
                entity.HatranyosHelyzetTipusId = co.HatranyosHelyzet;
                entity.NemzetisegTipusId = co.Nemzetisegi;
                entity.Tagozatnev = co.TagozatNeve;
                #endregion

                if (isNew)
                {
                    dal.Insert(entity);
                }
                else
                {
                    IKirKontenerElemDAL kirKontenerElemDal = h.KirKontenerElemDAL();
                    kirKontenerElemDal.DeleteManyByNebulo(entity.ID);

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

        public void SaveNemFelvettNebulo(int id, string indoklas)
        {
            Dal.CustomConnection.Run(ConnectionType, h =>
            {
                INebuloDal dal = h.Nebulo();
                INebulo entity = dal.Get(id);

                entity.FelvetelStatusza = (int)FelvetelStatuszaTipusEnum.NemFelveve;
                entity.Indoklas = indoklas;

                dal.FullUpdate(entity);
            });
        }

        public void SetFelvetelStatusza(int nebuloId, FelvetelStatuszaTipusEnum felvetelStatusza)
        {
            Dal.CustomConnection.Run(ConnectionType, h => h.Nebulo().SetFelvetelStatusza(nebuloId, felvetelStatusza));
        }

        //public void SetKozpontiMegjelent(int nebuloId, bool megjelent)
        //{
        //    Dal.CustomConnection.Run(ConnectionType, h => h.Nebulo().SetKozpontiMegjelent(nebuloId, megjelent));
        //}

        public void DeleteNebulo(int nebuloId)
        {
            Dal.CustomConnection.Run(ConnectionType, h => h.Nebulo().Delete(nebuloId));
        }

        public void DeleteNebuloKIRStatusz(int nebuloId)
        {
            Dal.CustomConnection.Run(ConnectionType, h => h.Nebulo().DeleteKIRStatusz(nebuloId));
        }

        public NebuloCo GetNebuloById(int id)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var dal = h.Nebulo();
                INebulo entity = dal.Get(id);

                DataSet feladatellatasiHelyDataSet = h.FeladatEllatasiHelyDal().GetFeladatEllatasiHelyekForkDropDown(TanevId);
                return new NebuloCo(entity, feladatellatasiHelyDataSet, TanevId);
            });
        }

        public void SaveNebuloMultiEdit(NebuloMultiEditCo nebuloMultiEditCo)
        {
            Dal.CustomConnection.Run(ConnectionType, h => h.Nebulo().SaveNebuloMultiEdit(nebuloMultiEditCo.ToPco()));
        }

        public List<NebuloCo> GetNebuloListByIdList(List<int> idList)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var nebuloList = h.Nebulo().GetNebuloListByIdList(idList);
                var result = GetNebuloCoList(h, nebuloList);
                return result;
            });
        }

        public List<NebuloCo> GetNebuloList()
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var nebuloList = h.Nebulo().GetNebuloList(TanevId);
                var result = GetNebuloCoList(h, nebuloList);
                return result;
            });
        }

        public List<NebuloCo> GetNebuloListForExport(NebuloSearchCo co)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                DataSet nebuloDataSet = h.Nebulo().GetNebuloListForExport(co?.ToPco());
                List<NebuloCo> result = GetNebuloCoList(h, nebuloDataSet);
                return result;
            });
        }

        public List<NebuloCo> GetErtesitendoNebuloList()
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var nebuloList = h.Nebulo().GetErtesitendoNebuloList();
                var result = GetNebuloCoList(h, nebuloList);
                return result;
            });
        }

        private List<NebuloCo> GetNebuloCoList(IDalHandler h, DataSet nebuloList)
        {
            var coList = new List<NebuloCo>();

            DataSet feladatellatasiHelyDataSet = h.FeladatEllatasiHelyDal().GetFeladatEllatasiHelyekForkDropDown(TanevId);

            foreach (DataRow row in nebuloList.Tables[0].Rows)
            {
                int? feladatellatasiHelyValue = SDAConvert.ToNullableInt32(row["C_FELADATELLATASIHELYID"]);
                int? feladatellatasiHelyId = null;
                string feladatellatasiHelyNev = null;
                if (feladatellatasiHelyValue.IsEntityId())
                {
                    DataRow feladatellatasiHelyDataRow = feladatellatasiHelyDataSet.Tables[0].AsEnumerable().SingleOrDefault(x => SDAConvert.ToNullableInt32(x["ID"]) == feladatellatasiHelyValue.Value);
                    if (feladatellatasiHelyDataRow != default(DataRow))
                    {
                        feladatellatasiHelyId = SDAConvert.ToNullableInt32(feladatellatasiHelyDataRow["ID"]);
                        feladatellatasiHelyNev = SDAConvert.ToString(feladatellatasiHelyDataRow["Nev"]);
                    }
                }

                DateTime? szuletesiIdo = SDAConvert.ToDateTime(row["C_SZULETESIIDO"]);
                string szuletesiVezeteknev = SDAConvert.ToString(row["C_SZULETESICSALADINEVE"]);
                string szuletesiKeresztnev = SDAConvert.ToString(row["C_SZULETESIUTONEVE"]);
                string szuletesiHely = SDAConvert.ToString(row["C_SZULETESIHELY"]);
                string anyjaVezetekneve = SDAConvert.ToString(row["C_EDESANYJASZULETESICSALADINEV"]);
                string anyjaKeresztneve = SDAConvert.ToString(row["C_EDESANYJASZULETESIUTONEVE"]);
                var co = new NebuloCo
                {
                    Id = SDAConvert.ToNullableInt32(row["ID"]),
                    Elotag = SDAConvert.ToString(row["C_ELOTAG"]),
                    Vezeteknev = SDAConvert.ToString(row["C_TANULOCSALADINEVE"]),
                    Keresztnev = SDAConvert.ToString(row["C_TANULOUTONEVE"]),
                    OktatasiAzonositoSzama = SDAConvert.ToString(row["C_OKTATASIAZONOSITOSZAMA"]),
                    NemeId = SDAConvert.ToNullableInt32(row["C_NEME"]),
                    NemeNev = SDAConvert.ToString(row["C_NEME_DNAME"]),
                    SzuletesiVezeteknev = szuletesiVezeteknev,
                    SzuletesiVezeteknevComparableString = szuletesiVezeteknev?.ToComparableString(),
                    SzuletesiKeresztnev = szuletesiKeresztnev,
                    SzuletesiKeresztnevComparableString = szuletesiKeresztnev?.ToComparableString(),
                    SzuletesiOrszagId = SDAConvert.ToNullableInt32(row["C_SZULETESIORSZAG"]),
                    SzuletesiOrszagNev = SDAConvert.ToString(row["C_SZULETESIORSZAG_DNAME"]),
                    SzuletesiHely = szuletesiHely,
                    SzuletesiHelyComparableString = szuletesiHely?.ToComparableString(),
                    SzuletesiIdo = szuletesiIdo,
                    SzuletesiIdoComparableString = szuletesiIdo?.ToString(Constants.ToStringPattern.SortableDateTimePattern)?.ToComparableString(),
                    AnyjaVezetekneve = anyjaVezetekneve,
                    AnyjaVezetekneveComparableString = anyjaVezetekneve?.ToComparableString(),
                    AnyjaKeresztneve = anyjaKeresztneve,
                    AnyjaKeresztneveComparableString = anyjaKeresztneve?.ToComparableString(),
                    AnyanyelvId = SDAConvert.ToNullableInt32(row["C_ANYANYELVE"]),
                    AnyanyelvNev = SDAConvert.ToString(row["C_ANYANYELVE_DNAME"]),
                    AllampolgarsagId = SDAConvert.ToNullableInt32(row["C_ALLAMPOLGARSAGA"]),
                    AllampolgarsagNev = SDAConvert.ToString(row["C_ALLAMPOLGARSAGA_DNAME"]),
                    Allampolgarsag2Id = SDAConvert.ToNullableInt32(row["C_ALLAMPOLGARSAGA2"]),
                    Allampolgarsag2Nev = SDAConvert.ToString(row["C_ALLAMPOLGARSAGA2_DNAME"]),
                    Orszag = SDAConvert.ToNullableInt32(row["C_ORSZAGTIPUSID"]),
                    Iranyitoszam = SDAConvert.ToString(row["C_IRANYITOSZAM"]),
                    Helyseg = SDAConvert.ToString(row["C_HELYSEGNEV"]),
                    KozteruletNev = SDAConvert.ToString(row["C_KOZTERULETNEV"]),
                    KozteruletJellegNev = SDAConvert.ToString(row["C_KOZTERULETJELLEGENEV"]),
                    Hazszam = SDAConvert.ToString(row["C_HAZSZAM"]),
                    Emelet = SDAConvert.ToString(row["C_EMELET"]),
                    Ajto = SDAConvert.ToString(row["C_AJTO"]),
                    THCimeAzonos = SDAConvert.ToBooleanFromTF(row["C_TARTOZKODASIHELYAZONOS"]),
                    THOrszag = SDAConvert.ToNullableInt32(row["C_THORSZAGTIPUSID"]),
                    THIranyitoszam = SDAConvert.ToString(row["C_THIRANYITOSZAM"]),
                    THHelyseg = SDAConvert.ToString(row["C_THHELYSEGNEV"]),
                    THKozteruletNev = SDAConvert.ToString(row["C_THKOZTERULETNEV"]),
                    THKozteruletJellegNev = SDAConvert.ToString(row["C_THKOZTERULETJELLEGENEV"]),
                    THHazszam = SDAConvert.ToString(row["C_THHAZSZAM"]),
                    THEmelet = SDAConvert.ToString(row["C_THEMELET"]),
                    THAjto = SDAConvert.ToString(row["C_THAJTO"]),
                    TKNev = SDAConvert.ToString(row["C_TKNEVE"]),
                    TKRokonsagiFokId = SDAConvert.ToNullableInt32(row["C_TKROKONSAGIFOKA"]),
                    TKRokonsagiFokNev = SDAConvert.ToString(row["C_TKROKONSAGIFOKA_DNAME"]),
                    TKEmail = SDAConvert.ToString(row["C_TKEMAILCIM"]),
                    TKTelefon = SDAConvert.ToString(row["C_TKTELEFON"]),
                    TKCimeAzonos = SDAConvert.ToBooleanFromTF(row["C_KEPVISELOCIMEAZONOS"]),
                    TKOrszag = SDAConvert.ToNullableInt32(row["C_TKORSZAGTIPUSID"]),
                    TKIranyitoszam = SDAConvert.ToString(row["C_TKIRANYITOSZAM"]),
                    TKHelyseg = SDAConvert.ToString(row["C_TKHELYSEGNEV"]),
                    TKKozteruletNev = SDAConvert.ToString(row["C_TKKOZTERULETNEV"]),
                    TKKozteruletJellegNev = SDAConvert.ToString(row["C_TKKOZTERULETJELLEGENEV"]),
                    TKHazszam = SDAConvert.ToString(row["C_TKHAZSZAM"]),
                    TKEmelet = SDAConvert.ToString(row["C_TKEMELET"]),
                    TKAjto = SDAConvert.ToString(row["C_TKAJTO"]),
                    TKNev2 = SDAConvert.ToString(row["C_TKNEVE2"]),
                    TKRokonsagiFok2Id = SDAConvert.ToNullableInt32(row["C_TKROKONSAGIFOKA2"]),
                    TKRokonsagiFok2Nev = SDAConvert.ToString(row["C_TKROKONSAGIFOKA2_DNAME"]),
                    TKEmail2 = SDAConvert.ToString(row["C_TKEMAILCIM2"]),
                    TKTelefon2 = SDAConvert.ToString(row["C_TKTELEFON2"]),
                    TKCimeAzonos2 = SDAConvert.ToBooleanFromTF(row["C_KEPVISELO2CIMEAZONOS"]),
                    TKOrszag2 = SDAConvert.ToNullableInt32(row["C_TKORSZAGTIPUSID2"]),
                    TKIranyitoszam2 = SDAConvert.ToString(row["C_TKIRANYITOSZAM2"]),
                    TKHelyseg2 = SDAConvert.ToString(row["C_TKHELYSEGNEV2"]),
                    TKKozteruletNev2 = SDAConvert.ToString(row["C_TKKOZTERULETNEV2"]),
                    TKKozteruletJelleg2Nev = SDAConvert.ToString(row["C_TKKOZTERULETJELLEGENEV2"]),
                    TKHazszam2 = SDAConvert.ToString(row["C_TKHAZSZAM2"]),
                    TKEmelet2 = SDAConvert.ToString(row["C_TKEMELET2"]),
                    TKAjto2 = SDAConvert.ToString(row["C_TKAJTO2"]),
                    //OvodaAzonosito = SDAConvert.ToString(row["C_OVODAAZONOSITO"]),
                    //OvodaNev = SDAConvert.ToString(row["C_OVODANEVE"]),
                    FeladatellatasiHelyId = feladatellatasiHelyId,
                    FeladatellatasiHelyNev = feladatellatasiHelyNev,
                    KirSzolgaltatasTipusId = SDAConvert.ToNullableInt32(row["C_KIRSZOLGALTATASTIPUSID"]),
                    KirSzolgaltatasTipusNev = SDAConvert.ToString(row["C_KIRSZOLGALTATASTIPUSID_DNAME"]),
                    TagozatId = SDAConvert.ToNullableInt32(row["C_TAGOZAT"]),
                    TagozatNev = SDAConvert.ToString(row["C_TAGOZAT_DNAME"]),
                    EtikaHitErkolcstanId = SDAConvert.ToNullableInt32(row["C_ETIKAHITERKOLCSTAN"]),
                    EtikaHitErkolcstanNev = SDAConvert.ToNullableInt32(row["C_ETIKAHITERKOLCSTAN"]).GetDisplayName<EtikaHitErkolcstanEnum>(TanevId),
                    FelekezetNev = SDAConvert.ToNullableInt32(row["C_FELEKEZETTIPUSID"]).GetDisplayName<FelekezetTipusEnum>(TanevId),
                    Megjegyzes = SDAConvert.ToString(row["C_MEGJEGYZES"]),
                    FelvetelStatuszaId = SDAConvert.ToNullableInt32(row["C_FELVETELSTATUSZA"]),
                    FelvetelStatuszaNev = SDAConvert.ToString(row["C_FELVETELSTATUSZA_DNAME"]),
                    EletvitelszeruOttLakasKorzetes = SDAConvert.ToBooleanFromTF(row["C_ELETVITELSZERUOTTLAKASKORZET"]),
                    SzakertoiBizottsagKormanyhivatalAltalKijelolttanulo = SDAConvert.ToBooleanFromTF(row["C_SZAKERTOIBIZOTTSAGKORMANYHIV"]),
                    SzulojeTestvereTartosanBetegVagyFogyatekkalElo = SDAConvert.ToBooleanFromTF(row["C_SZULOJETESTVERETARTOSANBETEG"]),
                    TestvereAzIntezmenyTanuloja = SDAConvert.ToBooleanFromTF(row["C_TESTVEREAZINTEZMENYTANULOJA"]),
                    SzulojenekMunkahelyeAzIskolaKorzetebenTalalhato = SDAConvert.ToBooleanFromTF(row["C_SZULOJENEKMUNKAHELYEAZISKOLA"]),
                    AzIskolaALakohelyetolEgyKilometerenBelulTalalhato = SDAConvert.ToBooleanFromTF(row["C_AZISKOLAALAKOHELYETOLEGYKILO"]),
                    IsOsszevontOsztaly = SDAConvert.ToBooleanFromTF(row["C_ISOSSZEVONTOSZTALYBA"]),
                    SNI = SDAConvert.ToBooleanFromTF(row["C_SNI"]),
                    SNILetszamSuly = SDAConvert.ToDouble(row["C_SNILETSZAMSULY"]),
                    BTM = SDAConvert.ToBooleanFromTF(row["C_BTM"]),
                    BTMLetszamSuly = SDAConvert.ToDouble(row["C_BTMLETSZAMSULY"]),
                    Importalt = SDAConvert.ToBooleanFromTF(row["C_IMPORTALT"]),
                    Osztalya = SDAConvert.ToString(row["C_OSZTALYA"]),
                    Indoklas = SDAConvert.ToString(row["C_INDOKLAS"]),

                    TKSzuletesiNev = SDAConvert.ToString(row["C_TKSZULETESINEV"]),
                    TK2SzuletesiNev = SDAConvert.ToString(row["C_TKSZULETESINEV2"]),
                    TKJogalap = SDAConvert.ToNullableInt32(row["C_TKJOGALAPTIPUSID"]),
                    TK2Jogalap = SDAConvert.ToNullableInt32(row["C_TKJOGALAPTIPUS2ID"]),
                };
                coList.Add(co);
            }

            return coList;
        }

        public void SetBeiratkozasVeglegesites(bool isVeglegesites)
        {
            Dal.CustomConnection.Run(ConnectionType, h => h.Nebulo().SetBeiratkozasVeglegesites(isVeglegesites));
        }

        public List<int> DeleteNebuloList(List<int> nebuloIdList)
        {
            var deletedNebuloIdList = new List<int>();
            foreach (var id in nebuloIdList)
            {
                try
                {
                    DeleteNebulo(id);
                    deletedNebuloIdList.Add(id);
                }
                catch (CannotBeDeletedException)
                {  /*ez ebben az esetben nem számít*/ }
            }

            return deletedNebuloIdList;
        }

        public void UpdateErtesitesiDatum(int nebuloId)
        {
            Dal.CustomConnection.Run(ConnectionType, h => h.Nebulo().UpdateErtesitesiDatum(nebuloId));
        }

        public bool CheckOktatasiAzonositoUtkozesValidation(int? nebuloId, int? felvetelStatusza, string oktatasiAzonosito)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var dal = h.Nebulo();

                var result = dal.CheckOktatasiAzonositoUtkozesValidation(nebuloId, felvetelStatusza, oktatasiAzonosito);
                return result;
            });
        }

        public List<KirNebuloCo> GetFelvettTanulokCoList()
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                DataSet nebuloList = h.Nebulo().GetFelvettNebuloList(IntezmenyId, TanevId);

                return KirNebuloCo.GetNebuloCoListFromDataSet(nebuloList);
            });
        }

        public bool GetIsEnableEugyHatarozat()
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var dal = h.Nebulo();

                var result = dal.GetIsEnableEugyHatarozat();
                return result;
            });
        }

        public Dictionary<int, string> GetAllNebuloDataForBai()
        {
            var hatarozatAdatokList = new Dictionary<int, string>();
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var dataSet = h.Nebulo().GetAllNebuloDataForBai();
                var enumerableDataSet = dataSet.Tables[0].AsEnumerable();

                foreach (var dr in enumerableDataSet)
                {
                    int kretaId = dr.Field<int>("ID");

                    var osztalya = dr.Field<string>("Osztalya").ReplaceMultipleSpacesAndTrim();

                    var hatarozatAdatok = new BaiHatarozatAdatok
                    {
                        KretaIntezmenyAzonosito = IntezmenyAzonosito,
                        IsFelveve = dr.Field<int>("FelvetelStatusza") == (int)FelvetelStatuszaTipusEnum.Felveve,
                        DontesSzovege = "",
                        Indoklas = dr.Field<string>("Indoklas"),
                        Ugyiratszam = "" + dr.Field<string>("C_EUGYSZAM")
                    };

                    //NOTE: EÜGYNEK SZÓKÖZT KELL KÜLDENÜNK, NE SZEDD KI!!!
                    if (!hatarozatAdatok.IsFelveve)
                    {
                        hatarozatAdatok.DontesSzovege = " ";            //NE SZEDD KI!!!
                    }

                    if (hatarozatAdatok.IsFelveve)
                    {
                        if (string.IsNullOrWhiteSpace(osztalya))
                        {
                            hatarozatAdatok.DontesSzovege = " ";        //NE SZEDD KI!!!
                            hatarozatAdatok.Indoklas = " ";             //NE SZEDD KI!!!
                        }
                        else
                        {
                            hatarozatAdatok.DontesSzovege = osztalya;
                            hatarozatAdatok.Indoklas = " ";             //NE SZEDD KI!!!
                        }
                    }

                    if (string.IsNullOrWhiteSpace(hatarozatAdatok.Indoklas))
                        hatarozatAdatok.Indoklas = " ";

                    hatarozatAdatok.Gondviselok = GetGondviselokHatarozatAdatFromDataRow(dr, h);

                    var urlapTartalom = GetNebuloDtoFromDataRow(dr);

                    string urlapAdatokString = JsonConvert.SerializeObject(urlapTartalom, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
                    hatarozatAdatok.UrlapTartalom = urlapAdatokString;

                    string hatarozatadatokNebuloval = JsonConvert.SerializeObject(hatarozatAdatok, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
                    hatarozatAdatokList.Add(kretaId, hatarozatadatokNebuloval);
                }

                return hatarozatAdatokList;
            });
        }

        private List<GondviseloHatarozatAdat> GetGondviselokHatarozatAdatFromDataRow(DataRow dr, IDalHandler h)
        {
            var gondviseloList = new List<GondviseloHatarozatAdat>();
            DataSet gondviseloBelepesiAdatok = GetGondviseloBelepesByNebuloOktatasiAzonosito(dr, h);
            var enumerableDataset = gondviseloBelepesiAdatok.Tables[0].AsEnumerable();

            foreach (var gondviseloBelepes in enumerableDataset)
            {
                gondviseloList.Add(new GondviseloHatarozatAdat
                {
                    GondviseloKretaAzonosito = gondviseloBelepes.Field<int>("ID"),
                    GondviseloBejelentkezesiNev = gondviseloBelepes.Field<string>("C_BEJELENTKEZESINEV"),
                    GondviseloNev = gondviseloBelepes.Field<string>("C_NEV"),
                    IdpEgyediAzonosito = gondviseloBelepes.Field<Guid>("C_IDPEGYEDIAZONOSITO"),
                    IsUjGondviselo = gondviseloBelepes.Field<int>("KovTanevGondviselo") == 1
                });
            }

            return gondviseloList;
        }

        private DataSet GetGondviseloBelepesByNebuloOktatasiAzonosito(DataRow dr, IDalHandler h)
        {
            var dataSet = h.Nebulo().GetGondviseloBelepesByNebuloOktatasiAzonosito(dr.Field<string>("TanuloOktatasiAzonosito"));
            return dataSet;
        }

        private NebuloDto GetNebuloDtoFromDataRow(DataRow dr)
        {
            var nebuloDto = new NebuloDto();
            var elerhetosegek = new ElerhetosegekDto
            {
                Lakohely = GetLakohelyFromDataRow(dr, "", false)
            };

            var szemelyesAdatok = new SzemelyesAdatokDto
            {
                Allampolgarsag = new DictionaryItemDto()
                {
                    KretaAzonosito = dr.Field<int?>("Allampolgarsag_Id") ?? default(int),
                    Nev = ""
                },
                SzuletesiOrszag = new DictionaryItemDto()
                {
                    KretaAzonosito = dr.Field<int?>("SzuletesiOrszag_Id") ?? default(int),
                    Nev = ""
                },
                Anyanyelv = new DictionaryItemDto()
                {
                    KretaAzonosito = dr.Field<int?>("Anyanyelv_Id") ?? default(int),
                    Nev = ""
                },
                TanuloOktatasiAzonosito = dr.Field<string>("TanuloOktatasiAzonosito"),
                TanuloElotag = dr.Field<string>("TanuloElotag"),
                TanuloCsaladinev = dr.Field<string>("TanuloCsaladinev"),
                TanuloUtonev = dr.Field<string>("TanuloUtonev"),
                SzuletesiHely = dr.Field<string>("SzuletesiHely"),
                SzuletesiIdo = dr.Field<DateTime>("SzuletesiIdo"),
                AnyjaSzuletesiCsaladnev = dr.Field<string>("AnyjaSzuletesiCsaladnev"),
                AnyjaSzuletesiUtonev = dr.Field<string>("AnyjaSzuletesiUtonev"),
            };

            if (dr.Field<int>("Neme_Id") == (int)NemEnum.Ferfi)
                szemelyesAdatok.Nem = "f";
            else
                szemelyesAdatok.Nem = "n";

            var valasztottIntezmeny = new ValasztottIntezmenyDto
            {
                Azonosito = null,
                Nev = dr.Field<string>("ValasztottIntezmeny_nev")
            };

            var igazolvanyok = new IgazolvanyokDto
            {
                Adoszam = "",
                SzemelyiIgazolvanySzam = "",
                TajSzam = ""
            };

            List<GondviseloDto> gondviseloDtoList = new List<GondviseloDto>();
            var elsoGondviselo = GetGondviseloDtoFromDataRow(dr, "ElsoGondviselo_");
            gondviseloDtoList.Add(elsoGondviselo);

            if (!string.IsNullOrEmpty(dr.Field<string>($"MasodikGondviselo_Teljes_Neve")))
            {
                var masodikGondviselo = GetGondviseloDtoFromDataRow(dr, "MasodikGondviselo_");
                gondviseloDtoList.Add(masodikGondviselo);
            }

            var ovoda = new OvodaDto
            {
                //Nev = dr.Field<string>("OviNeve"),
                //OvodaOMAzonosito = dr.Field<string>("OviAzonosito")
            };

            if (!string.IsNullOrWhiteSpace(dr["OviEvek"].ToString()))
            {
                ovoda.EltoltottEvekSzama = double.Parse(dr["OviEvek"].ToString());
            }

            //ovoda.NemMagyarorszagiOvodavalAllJogviszonyban = dr.Field<string>("OviNemMagyar") == "T";

            var iskolaErettseg = new IskolaErettsegDto
            {
                BeilleszkedesiNehezsegu = SDAConvert.ToBooleanFromTF(dr.Field<string>("BeilleszkedesiNehezsegu")),
                IskolaEgyKilometerenBelül = SDAConvert.ToBooleanFromTF(dr.Field<string>("IskolaEgyKilometerenBelül")),
                MunkaltatoiIgazolasIskolaKorzeteben = SDAConvert.ToBooleanFromTF(dr.Field<string>("MunkaltatoiIgazolasIskolaKorzeteben")),
                SajatosNevelesiIgenyu = SDAConvert.ToBooleanFromTF(dr.Field<string>("SajatosNevelesiIgenyu")),
                SzulojeTestvereTartosanBeteg = SDAConvert.ToBooleanFromTF(dr.Field<string>("SzulojeTestvereTartosanBeteg")),
                TestvereIntezmenyTanuloja = SDAConvert.ToBooleanFromTF(dr.Field<string>("TestvereIntezmenyTanuloja")),
                HatranyosHelyzet = new DictionaryItemDto
                {
                    KretaAzonosito = (int)HatranyosHelyzetTipusEnum.nem_hatranyos_helyzetu,
                    Nev = ""
                }
            };

            if (dr.Field<int?>("HatranyoshelyzetId").HasValue)
            {
                iskolaErettseg.HatranyosHelyzet.KretaAzonosito = dr.Field<int?>("HatranyoshelyzetId").Value;
            }

            var nemzetisegiOktatas = new NemzetisegiOktatasDto
            {
                Nemzetiseg = new DictionaryItemDto
                {
                    KretaAzonosito = 0,
                    Nev = ""
                }
            };

            if (dr.Field<int?>("NemzetisegId").HasValue)
            {
                switch (dr.Field<int?>("NemzetisegId").Value)
                {
                    case (int)NemzetisegTipusEnum.bolgar:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 1;
                        break;
                    case (int)NemzetisegTipusEnum.gorog:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 2;
                        break;
                    case (int)NemzetisegTipusEnum.horvat:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 3;
                        break;
                    case (int)NemzetisegTipusEnum.lengyel:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 4;
                        break;
                    case (int)NemzetisegTipusEnum.nemet:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 5;
                        break;
                    case (int)NemzetisegTipusEnum.ormeny:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 6;
                        break;
                    case (int)NemzetisegTipusEnum.roma:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 7;
                        break;
                    case (int)NemzetisegTipusEnum.roman:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 8;
                        break;
                    case (int)NemzetisegTipusEnum.ruszin:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 9;
                        break;
                    case (int)NemzetisegTipusEnum.szerb:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 10;
                        break;
                    case (int)NemzetisegTipusEnum.szlovak:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 11;
                        break;
                    case (int)NemzetisegTipusEnum.szloven:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 12;
                        break;
                    case (int)NemzetisegTipusEnum.ukran:
                        nemzetisegiOktatas.Nemzetiseg.KretaAzonosito = 13;
                        break;
                }
            }

            var iskolaiTavozas = new IskolaiTavozasDto
            {
                TavozastKer = false
            };

            var etikaHitErkolcstan = new EtikaHitErkolcstanDto
            {
                Egyhaz = GetEgyhazByDataRow(dr),
                ValasztottTantargy = GetValasztottTantargyByDataRow(dr)
            };

            var etkezes = new EtkezesDto
            {
                EtkezestKer = false
            };

            var valasztottTagozat = new ValasztottTagozatDto
            {
                Azonosito = 0,
                Nev = dr.Field<string>("TagozatNev")
            };

            nebuloDto.Elerhetosegek = elerhetosegek;
            nebuloDto.EtikaHitErkolcstan = etikaHitErkolcstan;
            nebuloDto.Etkezes = etkezes;
            nebuloDto.Gondviselok = gondviseloDtoList;
            nebuloDto.Igazolvanyok = igazolvanyok;
            nebuloDto.IskolaErettseg = iskolaErettseg;
            nebuloDto.IskolaiTavozas = iskolaiTavozas;
            nebuloDto.NemzetisegiOktatas = nemzetisegiOktatas;
            nebuloDto.Ovoda = ovoda;
            nebuloDto.SzemelyesAdatok = szemelyesAdatok;
            nebuloDto.ValasztottIntezmeny = valasztottIntezmeny;
            nebuloDto.ValasztottTagozat = valasztottTagozat;

            return nebuloDto;
        }

        private ValasztottTantargyDto GetValasztottTantargyByDataRow(DataRow dr)
        {
            var valasztottTantargy = new ValasztottTantargyDto();
            if (dr.Field<int?>("EtikaHitErkolcstan") == null || dr.Field<int>("EtikaHitErkolcstan") == (int)EtikaHitErkolcstanEnum.JogszabalyilagNemRelevans)
            {
                valasztottTantargy.Azonosito = 3;
                valasztottTantargy.Kod = "NEM_RELEVANS";
                valasztottTantargy.Nev = "Jogszabályilag nem releváns";
            }
            else if (dr.Field<int>("EtikaHitErkolcstan") == (int)EtikaHitErkolcstanEnum.Etika)
            {
                valasztottTantargy.Azonosito = 1;
                valasztottTantargy.Kod = "ETIKA";
                valasztottTantargy.Nev = "Etika";
            }
            else if (dr.Field<int>("EtikaHitErkolcstan") == (int)EtikaHitErkolcstanEnum.HitEsErkolcstan)
            {
                valasztottTantargy.Azonosito = 2;
                valasztottTantargy.Kod = "HIT_ERKOLCSTAN";
                valasztottTantargy.Nev = "Hit- és erkölcstan";
            }

            return valasztottTantargy;
        }

        private EgyhazDto GetEgyhazByDataRow(DataRow dr)
        {
            var egyhaz = new EgyhazDto();
            if (dr.Field<int?>("FelekezetId").HasValue)
            {
                switch (dr.Field<int?>("FelekezetId").Value)
                {
                    case (int)FelekezetTipusEnum.magyar_katolikus_egyhaz:
                        egyhaz.Azonosito = 1;
                        break;
                    case (int)FelekezetTipusEnum.magyarorszagi_reformatus_egyhaz:
                        egyhaz.Azonosito = 2;
                        break;
                    case (int)FelekezetTipusEnum.magyarorszagi_evangelikus_egyhaz:
                        egyhaz.Azonosito = 3;
                        break;
                    case (int)FelekezetTipusEnum.magyarorszagi_zsido_hitkozsegek_szovetsege:
                        egyhaz.Azonosito = 4;
                        break;
                    case (int)FelekezetTipusEnum.egyseges_magyarorszagi_izraelita_hitkozseg_statusquo_ante:
                        egyhaz.Azonosito = 5;
                        break;
                    case (int)FelekezetTipusEnum.magyarorszagi_autonom_orthodox_izraelita_hitkozseg:
                        egyhaz.Azonosito = 6;
                        break;
                    case (int)FelekezetTipusEnum.budai_szerb_ortodox_egyhazmegye:
                        egyhaz.Azonosito = 7;
                        break;
                    case (int)FelekezetTipusEnum.konstantinapolyi_egyetemes_patriarchatus_magyarorszagi_ortodox_exarchatus:
                        egyhaz.Azonosito = 8;
                        break;
                    case (int)FelekezetTipusEnum.magyarorszagi_bolgar_ortodox_egyhaz:
                        egyhaz.Azonosito = 9;
                        break;
                    case (int)FelekezetTipusEnum.magyarorszagi_roman_ortodox_egyhazmegye:
                        egyhaz.Azonosito = 10;
                        break;
                    case (int)FelekezetTipusEnum.orosz_ortodox_egyhaz_magyar_egyhazmegyeje_moszkvai_patriarchatus:
                        egyhaz.Azonosito = 11;
                        break;
                    case (int)FelekezetTipusEnum.magyar_unitarius_egyhaz_magyarorszagi_egyhazkerulete_magyarorszagi_unitarius_egyhaz:
                        egyhaz.Azonosito = 12;
                        break;
                    case (int)FelekezetTipusEnum.magyarorszagi_baptista_egyhaz:
                        egyhaz.Azonosito = 13;
                        break;
                    case (int)FelekezetTipusEnum.hit_gyulekezete:
                        egyhaz.Azonosito = 14;
                        break;
                    case (int)FelekezetTipusEnum.magyarorszagi_metodista_egyhaz:
                        egyhaz.Azonosito = 15;
                        break;
                    case (int)FelekezetTipusEnum.magyar_punkosdi_egyhaz:
                        egyhaz.Azonosito = 16;
                        break;
                    case (int)FelekezetTipusEnum.szent_margit_anglikan_episzkopalis_egyhaz:
                        egyhaz.Azonosito = 17;
                        break;
                    case (int)FelekezetTipusEnum.erdelyi_gyulekezet:
                        egyhaz.Azonosito = 18;
                        break;
                    case (int)FelekezetTipusEnum.hetednapi_adventista_egyhaz:
                        egyhaz.Azonosito = 19;
                        break;
                    case (int)FelekezetTipusEnum.magyarorszagi_kopt_ortodox_egyhaz:
                        egyhaz.Azonosito = 20;
                        break;
                    case (int)FelekezetTipusEnum.magyarorszagi_iszlam_tanacs:
                        egyhaz.Azonosito = 21;
                        break;
                    case (int)FelekezetTipusEnum.krisztusban_hivo_nazarenus_gyulekezetek:
                        egyhaz.Azonosito = 22;
                        break;
                    case (int)FelekezetTipusEnum.magyarorszagi_krisnatudatu_hivok_kozossege:
                        egyhaz.Azonosito = 23;
                        break;
                    case (int)FelekezetTipusEnum.az_udvhadsereg_szabadegyhaz_magyarorszag:
                        egyhaz.Azonosito = 24;
                        break;
                    case (int)FelekezetTipusEnum.az_utolso_napok_szentjeinek_jezus_krisztus_egyhaza:
                        egyhaz.Azonosito = 25;
                        break;
                    case (int)FelekezetTipusEnum.magyarorszagi_jehova_tanui_egyhaz:
                        egyhaz.Azonosito = 26;
                        break;
                    case (int)FelekezetTipusEnum.buddhista_vallasi_kozossegek:
                        egyhaz.Azonosito = 27;
                        break;
                    case (int)FelekezetTipusEnum.nincs_adat:
                        egyhaz.Azonosito = 28;
                        break;
                    case (int)FelekezetTipusEnum.romai_katolikus_egyhaz:
                        egyhaz.Azonosito = 29;
                        break;
                    case (int)FelekezetTipusEnum.gorog_katolikus_egyhaz:
                        egyhaz.Azonosito = 30;
                        break;
                }

                egyhaz.Kod = "";
                egyhaz.Nev = "";
            }
            else
            {
                egyhaz.Azonosito = 28;
                egyhaz.Kod = "NINCS_ADAT";
                egyhaz.Nev = "(Nincs adat)";
            }

            return egyhaz;
        }

        public DataSet GetBAIPreCheckUgyszamList()
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Nebulo();
                return dal.GetBAIPreCheckUgyszamList();
            });
        }

        public bool GetKretaPreCheck()
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var result = h.Nebulo().GetKretaPreCheck(TanevId);
                return result;
            });
        }

        #region DTO-->JSON  Átalakítás

        private GondviseloDto GetGondviseloDtoFromDataRow(DataRow dr, string elotag)
        {
            var torvenyesKepviseletJogalapja = GetTorvenyesKepviseletJogalapja(dr, elotag);
            var rokonsagiFok = new DictionaryItemDto()
            {
                KretaAzonosito = dr.Field<int?>($"{elotag}RokonsagiFok_Id") == null ? 0 : dr.Field<int?>($"{elotag}RokonsagiFok_Id").Value,
                Nev = ""
            };

            var lakhely = GetLakohelyFromDataRow(dr, elotag, true);
            var gondviseloNeve = dr.Field<string>($"{elotag}Teljes_Neve");
            var gondviseloSzulNeve = dr.Field<string>($"{elotag}SzuletesiNev");

            string keresztnev = "[na]", vezetekNev = "[na]";
            var nev = gondviseloNeve.ReplaceMultipleSpacesAndTrim();
            if (!string.IsNullOrWhiteSpace(nev))
            {
                var indxOf = nev.LastIndexOf(' ');
                if (indxOf != -1)
                {
                    vezetekNev = nev.Substring(0, indxOf);
                    keresztnev = nev.Substring(indxOf, nev.Length - indxOf);
                }
                else
                    vezetekNev = nev;
            }

            string szulKeresztnev = "[na]", szulVezetekNev = "[na]";
            var szulNev = gondviseloSzulNeve.ReplaceMultipleSpacesAndTrim();
            if (!string.IsNullOrWhiteSpace(szulNev))
            {
                var indxOfSzul = szulNev.LastIndexOf(' ');
                if (indxOfSzul != -1)
                {
                    szulVezetekNev = szulNev.Substring(0, indxOfSzul);
                    szulKeresztnev = szulNev.Substring(indxOfSzul, szulNev.Length - indxOfSzul);
                }
                else
                    szulVezetekNev = szulNev;
            }

            var gondviseloDto = new GondviseloDto
            {
                TorvenyesKepviseletJogalapja = torvenyesKepviseletJogalapja,
                //RokonsagiFok = rokonsagiFok,
                Lakhely = lakhely,
                AnyjaSzuletesiCsaladnev = "[na]",
                AnyjaSzuletesiUtonev = "[na]",
                CsaladiNev = vezetekNev,
                Utonev = keresztnev,
                SzuletesiCsaladnev = szulVezetekNev,
                SzuletesiUtonev = szulKeresztnev,
                EMail = dr.Field<string>($"{elotag}EMail"),
                LakohelyEgyezikTanuloAllandoLakhelyevel = SDAConvert.ToBooleanFromTF(dr.Field<string>($"{elotag}LakohelyEgyezikTanuloAllandoLakhelyevel")),
                Telefonszam = dr.Field<string>($"{elotag}Telefonszam")
            };

            return gondviseloDto;
        }

        private TorvenyesKepviseletJogalapjaDto GetTorvenyesKepviseletJogalapja(DataRow dr, string elotag)
        {
            var name = $"{elotag}Jogalap";

            if (dr.Field<int?>(name).HasValue && (dr.Field<int?>(name).Value == 8622))
            {
                return new TorvenyesKepviseletJogalapjaDto
                {
                    Azonosito = 1,
                    Kod = "SZULO",
                    Nev = ""
                };
            }

            return new TorvenyesKepviseletJogalapjaDto
            {
                Azonosito = 2,
                Kod = "GYAM",
                Nev = ""
            };
        }

        private LakohelyDto GetLakohelyFromDataRow(DataRow dr, string elotag, bool isGondviselo)
        {
            var eletvitelszeruLakhely = new LakhelyDto();
            if (!isGondviselo && dr.Field<string>("C_TARTOZKODASIHELYAZONOS") == "F")
            {
                eletvitelszeruLakhely = new LakhelyDto
                {
                    Helyseg = dr.Field<string>($"{elotag}EletvitelszeruLakhelyHelyseg"),
                    Iranyitoszam = dr.Field<string>($"{elotag}EletvitelszeruLakhelyIranyitoszam"),
                    KozteruletNeve = dr.Field<string>($"{elotag}EletvitelszeruLakhelyKozteruletNeve"),
                    KozteruletJellege = dr.Field<string>($"{elotag}EletvitelszeruLakhelyKozteruletJellege"),
                    Orszag = new OrszagDto()
                    {
                        KretaAzonosito = dr.Field<int?>($"{elotag}EletvitelszeruLakhelyOrszagId") ?? default(int),
                        Nev = ""
                    },
                    Hazszam = dr.Field<string>($"{elotag}EletvitelszeruLakhelyHazszam"),
                    Emelet = dr.Field<string>($"{elotag}EletvitelszeruLakhelyEmelet"),
                    Ajto = dr.Field<string>($"{elotag}EletvitelszeruLakhelyAjto")
                };
            }

            var lakhelyDto = new LakohelyDto
            {
                AllandoLakhely = new LakhelyDto
                {
                    Helyseg = dr.Field<string>($"{elotag}AllandoLakhelyHelyseg"),
                    Iranyitoszam = dr.Field<string>($"{elotag}AllandoLakhelyIranyitoszam"),
                    KozteruletNeve = dr.Field<string>($"{elotag}AllandoLakhelyKozteruletNeve"),
                    KozteruletJellege = dr.Field<string>($"{elotag}AllandoLakhelyKozteruletJellege"),
                    Orszag = new OrszagDto()
                    {
                        KretaAzonosito = dr.Field<int?>($"{elotag}AllandoLakhelyOrszagId") ?? default(int),
                        Nev = ""
                    },
                    Hazszam = dr.Field<string>($"{elotag}AllandoLakhelyHazszam"),
                    Emelet = dr.Field<string>($"{elotag}AllandoLakhelyEmelet"),
                    Ajto = dr.Field<string>($"{elotag}AllandoLakhelyAjto")
                }
            };

            if (!isGondviselo && dr.Field<string>("C_TARTOZKODASIHELYAZONOS") == "F")
                lakhelyDto.EletvitelszeruLakhely = eletvitelszeruLakhely;

            if ((!isGondviselo && dr.Field<string>("C_TARTOZKODASIHELYAZONOS") == "T") || (isGondviselo && dr.Field<string>($"{elotag}LakohelyEgyezikTanuloAllandoLakhelyevel") == "F"))
            {
                lakhelyDto.EletvitelszeruLakhelyEgyezik = true;
            }

            if (isGondviselo && dr.Field<string>($"{elotag}LakohelyEgyezikTanuloAllandoLakhelyevel") == "T")
            {
                lakhelyDto.EletvitelszeruLakhelyEgyezik = true;
                lakhelyDto.LakohelyEgyezikTanuloAllandoLakhelyevel = true;
            }

            return lakhelyDto;
        }

        #endregion DTO-->JSON  Átalakítás

        public void UpdateNebuloStatusz(string eUgyszam, string tanuloOktatasiAzonosito, int statusz)
        {
            Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Nebulo();
                dal.UpdateNebuloStatusz(eUgyszam, tanuloOktatasiAzonosito, statusz);
            });
        }

        public void UpdateNebuloStatusz(int nebuloId, string eUgyszam, int statusz)
        {
            Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Nebulo();
                dal.UpdateNebuloStatusz(nebuloId, eUgyszam, statusz);
            });
        }

        public bool IsNebuloLetezikAdottStatuszban(string oktatasiAzonositoSzama, DateTime szuletesiIdo, int statuszId)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var dal = h.Nebulo();

                var result = dal.IsNebuloLetezikAdottStatuszban(oktatasiAzonositoSzama, szuletesiIdo, statuszId);
                return result;
            });
        }

        public DataSet GetNemSzinkronizaltNebulok()
        {
            return Dal.CustomConnection.Run(ConnectionType, h => h.Nebulo().GetNemSzinkronizaltNebulok(TanevId));
        }

        public int GetOvodasGvCntByNebuloOktAzon(string oktAzon)
        {
            return Dal.CustomConnection.Run(ConnectionType, h => h.Nebulo().GetOvodasGvCntByNebuloOktAzon(TanevId, oktAzon));
        }
    }
}