using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Kreta.BusinessLogic.Classes;
using Kreta.BusinessLogic.HelperClasses;
using Kreta.BusinessLogic.HelperClasses.ApaczaiProgramCOs;
using Kreta.Client.KGR;
using Kreta.Client.KGR.Request;
using Kreta.Core;
using Kreta.Core.ConnectionType;
using Kreta.DataAccessManual;
using Kreta.DataAccessManual.Util;
using Kreta.Enums;
using Kreta.Enums.ManualEnums;
using Kreta.Resources;

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

        public bool CreatePalyazat(IKGRClient client, ApaczaiPalyazatFelvetelRequest kgrRequestModel)
        {
            var palyazat = client.CreateApaczaiPalyazat(kgrRequestModel);
            return palyazat != null;
        }

        public bool PalyazatAdategyeztetes(IKGRClient client, ApaczaiPalyazatFelvetelRequest kgrRequestModel)
        {
            var palyazat = client.PalyazatAdategyeztetes(kgrRequestModel);
            return palyazat != null;
        }

        public ApaczaiPalyazatFelvetelRequest GetApaczaiPalyazatFelvetelRequest(TanuloAdatokCo model, bool isSelectedTanev20_21OrLater, bool isSelectedTanev21_22OrLater)
        {
            var tanevSorszam = new TanevHelper(ConnectionType).GetTanevInfo().Sorszam;

            var tanuloOktatasNevelesAdatok = GetTanuloiAdatok(model, isSelectedTanev20_21OrLater, isSelectedTanev21_22OrLater);

            var kgrRequestModel = new ApaczaiPalyazatFelvetelRequest()
            {
                TanevId = tanevSorszam,
                Palyazo = new ApaczaiPalyazatPalyazo
                {
                    Allampolgarsag = model.Allampolgarsag,
                    Allampolgarsag2 = model.Allampolgarsag2,
                    Anyanyelv = model.Anyanyelv,
                    AnyjaSzuletesiCsaladiNev = model.AnyjaCsaladiNeve,
                    AnyjaSzuletesiUtonev = model.AnyjaUtonev,
                    CsaladiNev = model.CsaladiNev,
                    EloTag = model.EloTag,
                    FenntartoAzonosito = model.FenntartoAzonosito,
                    FenntartoNev = model.FenntartoNev,
                    IntezmenyEgyediAzonosito = model.IntezmenyEgyediAzonosito,
                    IntezmenyNev = model.IntezmenyNev,
                    IntezmenyAzonosito = model.IntezmenyAzonosito,
                    IdpEgyediAzonosito = model.IdpEgyediAzonosito,
                    OktatasiAzonosito = model.OktatasiAzonosito,
                    SzuletesiCsaladNev = model.SzuletesiCsaladNev,
                    SzuletesiHely = model.SzuletesiHely,
                    SzuletesiIdo = model.SzuletesiIdo,
                    SzuletesiOrszag = model.SzuletesiOrszag,
                    SzuletesiUtonev = model.SzuletesiUtonev,
                    Utonev = model.Utonev,
                    Bankszamla = new ApaczaiPalyazatBankszamla
                    {
                        BankszamlaSzam = model.BankszamlaSzam,
                        BankszamlaTulajdonosNeve = model.BankszamlaTulajdonosNeve,
                        BankszamlaTulajdonosa = model.BankszamlaTulajdonos,
                        SzamlavezetoBank = model.SzamlavezetoBank,
                    },
                    AllandoElerhetoseg = model.AllandoElerhetoseg != null && !string.IsNullOrWhiteSpace(model.AllandoElerhetoseg.Orszag) ? new ApaczaiPalyazatElerhetoseg
                    {
                        Ajto = model.AllandoElerhetoseg.Ajto,
                        CimTipus = model.AllandoElerhetoseg.CimTipus,
                        Emailcim = model.AllandoElerhetoseg.Emailcim,
                        EmailTipus = model.AllandoElerhetoseg.EmailTipus,
                        Emelet = model.AllandoElerhetoseg.Emelet,
                        Hazszam = model.AllandoElerhetoseg.Hazszam,
                        HelysegNev = model.AllandoElerhetoseg.HelysegNev,
                        Iranyitoszam = model.AllandoElerhetoseg.Iranyitoszam,
                        KozteruletNev = model.AllandoElerhetoseg.KozteruletNev,
                        KozteruletTipus = model.AllandoElerhetoseg.KozteruletTipus,
                        Orszag = model.AllandoElerhetoseg.Orszag,
                        TelefonSzam = model.AllandoElerhetoseg.TelefonSzam,
                        TelefonTipus = model.AllandoElerhetoseg.TelefonTipus,
                    } : null,
                    TartozkodasiElerhetoseg = model.TartozkodasiElerhetoseg != null && !string.IsNullOrWhiteSpace(model.TartozkodasiElerhetoseg.Orszag) ? new ApaczaiPalyazatElerhetoseg
                    {
                        Ajto = model.TartozkodasiElerhetoseg.Ajto,
                        CimTipus = model.TartozkodasiElerhetoseg.CimTipus,
                        Emailcim = model.TartozkodasiElerhetoseg.Emailcim,
                        EmailTipus = model.TartozkodasiElerhetoseg.EmailTipus,
                        Emelet = model.TartozkodasiElerhetoseg.Emelet,
                        Hazszam = model.TartozkodasiElerhetoseg.Hazszam,
                        HelysegNev = model.TartozkodasiElerhetoseg.HelysegNev,
                        Iranyitoszam = model.TartozkodasiElerhetoseg.Iranyitoszam,
                        KozteruletNev = model.TartozkodasiElerhetoseg.KozteruletNev,
                        KozteruletTipus = model.TartozkodasiElerhetoseg.KozteruletTipus,
                        Orszag = model.TartozkodasiElerhetoseg.Orszag,
                        TelefonSzam = model.TartozkodasiElerhetoseg.TelefonSzam,
                        TelefonTipus = model.TartozkodasiElerhetoseg.TelefonTipus,
                    } : null,
                    KeziAtlag = model.KeziAtlag,
                    SzamitottAtlag = model.SzamitottAtlag,
                    AtlagKomment = model.Feljegyzes,
                    TAJszam = model.TAJSzam,
                    IsSzakkepzesenKivulrolJott = tanuloOktatasNevelesAdatok.IsSzakkepzesenKivulrolJott,
                    Osztaly = tanuloOktatasNevelesAdatok.OsztalyNev,
                    Evfolyam = tanuloOktatasNevelesAdatok.EvfolyamNev
                },
                ModositoId = model.ModositoId,
                ModositoNev = model.ModositoNev,
                HatranyosHelyzetHatarozatDatum = new DateTime(model.HatranyosHelyzetIgazolasKiallitasDatuma, 1, 1),
                PalyazatMentor = new ApaczaiPalyazatMentor()
                {
                    FenntartoAzonosito = !string.IsNullOrWhiteSpace(tanuloOktatasNevelesAdatok.MentorFenntartoAzonosito) ? tanuloOktatasNevelesAdatok.MentorFenntartoAzonosito : model.FenntartoAzonosito,
                    FenntartoNev = !string.IsNullOrWhiteSpace(tanuloOktatasNevelesAdatok.MentorFenntartoNev) ? tanuloOktatasNevelesAdatok.MentorFenntartoNev : model.FenntartoNev,
                    LegmagasabbSzintuFenntartoNev = tanuloOktatasNevelesAdatok.MentorLegmagasabbSzintuFenntartoNev,
                    IntezmenyEgyediAzonosito = tanuloOktatasNevelesAdatok.MentorIntezmenyEgyediAzonosito,
                    IntezmenyNev = tanuloOktatasNevelesAdatok.MentorIntezmenyNev,
                    IntezmenyAzonosito = tanuloOktatasNevelesAdatok.MentorIntezmenyAzonosito,
                    IntezmenyVezetoNev = tanuloOktatasNevelesAdatok.MentorIntezmenyVezetoNev,
                    OMKod = tanuloOktatasNevelesAdatok.MentorOMKod,
                    Bankszamla = new ApaczaiPalyazatMentorBankszamla
                    {
                        BankszamlaSzam = tanuloOktatasNevelesAdatok.MentorBankszamlaSzam,
                        BankszamlaTulajdonosNeve = tanuloOktatasNevelesAdatok.MentorBankszamlaTulajdonosNeve,
                        BankszamlaTulajdonosa = tanuloOktatasNevelesAdatok.MentorBankszamlaTulajdonosa,
                        SzamlavezetoBank = tanuloOktatasNevelesAdatok.MentorSzamlavezetoBank,
                    },
                    Elerhetoseg = new ApaczaiPalyazatMentorElerhetoseg
                    {
                        Ajto = tanuloOktatasNevelesAdatok.MentorAjto,
                        CimTipus = tanuloOktatasNevelesAdatok.MentorCimTipus,
                        Emailcim = tanuloOktatasNevelesAdatok.MentorEmailcim,
                        EmailTipus = tanuloOktatasNevelesAdatok.MentorEmailTipus,
                        Emelet = tanuloOktatasNevelesAdatok.MentorEmelet,
                        Hazszam = tanuloOktatasNevelesAdatok.MentorHazszam,
                        HelysegNev = tanuloOktatasNevelesAdatok.MentorHelysegNev,
                        Iranyitoszam = tanuloOktatasNevelesAdatok.MentorIranyitoszam,
                        KozteruletNev = tanuloOktatasNevelesAdatok.MentorKozteruletNev,
                        KozteruletTipus = tanuloOktatasNevelesAdatok.MentorKozteruletTipus,
                        Orszag = tanuloOktatasNevelesAdatok.MentorOrszag,
                        TelefonSzam = tanuloOktatasNevelesAdatok.MentorTelefonSzam,
                        TelefonTipus = tanuloOktatasNevelesAdatok.MentorTelefonTipus,
                    },
                    IdpEgyediAzonosito = tanuloOktatasNevelesAdatok.MentorIdpEgyediAzonosito,
                    OktatasiAzonosito = tanuloOktatasNevelesAdatok.MentorOktatasiAzonosito,
                    Nev = tanuloOktatasNevelesAdatok.MentorNev,
                    SzuletesiNev = tanuloOktatasNevelesAdatok.MentorSzuletesiNev,
                    SzuletesiHely = tanuloOktatasNevelesAdatok.MentorSzuletesiHely,
                    SzuletesiIdo = tanuloOktatasNevelesAdatok.MentorSzuletesiIdo,
                    AnyjaNeve = tanuloOktatasNevelesAdatok.MentorAnyjaSzuletesiNev,
                    TAJszam = tanuloOktatasNevelesAdatok.MentorTAJszam,
                    AdoazonositoJel = tanuloOktatasNevelesAdatok.MentorAdoazonositoJel,
                    SzTSz = tanuloOktatasNevelesAdatok.MentorSzTSz,
                    NyugdijTipusId = tanuloOktatasNevelesAdatok.MentorNyugdijTipusId,
                    NyugdijTipusNev = tanuloOktatasNevelesAdatok.MentorNyugdijTipusNev,
                    NyugdijKezdete = tanuloOktatasNevelesAdatok.MentorNyugdijKezdete,
                }
            };
            return kgrRequestModel;
        }

        public bool ValidateTanuloMentor(ApaczaiPalyazatFelvetelRequest co)
        {
            return !string.IsNullOrWhiteSpace(co.PalyazatMentor.FenntartoAzonosito)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.FenntartoNev)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.Nev)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.OMKod)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.TAJszam)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.AnyjaNeve)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.IntezmenyNev)
                && co.PalyazatMentor.SzuletesiIdo != (DateTime)default
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.SzuletesiNev)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.SzuletesiHely)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.AdoazonositoJel)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.OktatasiAzonosito)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.IntezmenyAzonosito)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.IntezmenyVezetoNev)
                && co.PalyazatMentor.Bankszamla != null
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.Bankszamla.BankszamlaSzam)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.Bankszamla.SzamlavezetoBank)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.Bankszamla.BankszamlaTulajdonosNeve)
                && co.PalyazatMentor.Elerhetoseg != null
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.Elerhetoseg.Orszag)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.Elerhetoseg.Hazszam)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.Elerhetoseg.Emailcim)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.Elerhetoseg.HelysegNev)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.Elerhetoseg.TelefonSzam)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.Elerhetoseg.Iranyitoszam)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.Elerhetoseg.KozteruletNev)
                && !string.IsNullOrWhiteSpace(co.PalyazatMentor.Elerhetoseg.KozteruletTipus);
        }

        private TanuloAdatCO GetTanuloiAdatok(TanuloAdatokCo model, bool isSelectedTanev20_21OrLater, bool isSelectedTanev21_22OrLater)
        {
            var tanuloHelper = new TanuloHelper(ConnectionType);
            var osztalyCsoport = tanuloHelper.GetOsztalyCsoport(model.ModositoId, (int)OktNevelesiKategoriaEnum.NevelesOktatas, false);

            if (osztalyCsoport.Tables[0].Rows.Count > 0)
            {
                var osztalycsoportId = osztalyCsoport.Tables[0].Select("IsCsoport = 'F'").OrderByDescending(s => s["ErvKezd"]).First().Field<int?>("OsztalyCsoportId");                

                return tanuloHelper.GetTanuloiAdatok(model.ModositoId, kovTanevId: null, isSelectedTanev20_21OrLater, isSelectedTanev21_22OrLater, osztalycsoportId);
            }

            return tanuloHelper.GetTanuloiAdatok(model.ModositoId, kovTanevId: null, isSelectedTanev20_21OrLater, isSelectedTanev21_22OrLater);
        }

        public (int countEgyebDokumentum, int countHatranyosHelyzetIgazolas, int countHozzajaruloDokumentum, int countElozoTanevEvvegiBizonyitvany, int countMentoriTamogatoNyilatkozat) GetFeltoltottDokumentumKategoriak(IKGRClient client, Guid tanuloIdpEgyediAzonosito)
        {
            var dokumetumok = GetPalyazatDokumentumai(client, tanuloIdpEgyediAzonosito);
            var countEgyebDokumentum = dokumetumok.Count(x => x.Kategoria == ApaczaiDokumentumTipusEnum.Egyeb);
            var countHatranyosHelyzetIgazolas = dokumetumok.Count(x => x.Kategoria == ApaczaiDokumentumTipusEnum.HatranyosHelyzetIgazolas);
            var countHozzajaruloDokumentum = dokumetumok.Count(x => x.Kategoria == ApaczaiDokumentumTipusEnum.HozzajaruloNyilatkozat);
            var countElozoTanevEvvegiBizonyitvany = dokumetumok.Count(x => x.Kategoria == ApaczaiDokumentumTipusEnum.ElozoTanevEvvegiBizonyitvany);
            var countMentoriTamogatoNyilatkozat = dokumetumok.Count(x => x.Kategoria == ApaczaiDokumentumTipusEnum.MentoriTamogatoNyilatkozat);
            return (countEgyebDokumentum, countHatranyosHelyzetIgazolas, countHozzajaruloDokumentum, countElozoTanevEvvegiBizonyitvany, countMentoriTamogatoNyilatkozat);
        }

        public PalyazatCo GetPalyazat(IKGRClient client, Guid tanuloIdpEgyediAzonosito)
        {
            var tanevSorszam = new TanevHelper(ConnectionType).GetTanevInfo().Sorszam;
            var palyazat = client.GetApaczaiPalyazat(tanevSorszam, tanuloIdpEgyediAzonosito);

            if (palyazat is null || !palyazat.StatuszId.IsEntityId())
            {
                return new PalyazatCo();
            }

            var statusz = MapKgrPalyazatStatuszIdToApaczaiStatusz(palyazat.StatuszId);
            // NOTE: Ha központi küldi ezt a kommentet, akkor törölni ezt + resourcet is.
            var komment = palyazat.StatuszKomment;
            switch (statusz)
            {
                case ApaczaiPalyazatStatuszEnum.Bekuldott:
                    if (string.IsNullOrWhiteSpace(palyazat.StatuszKomment))
                    {
                        komment = TanuloApaczaiResource.BekuldottPalyazatKomment;
                    }
                    break;
                case ApaczaiPalyazatStatuszEnum.AdategyeztetesreVisszakuldve:
                    if (string.IsNullOrWhiteSpace(palyazat.EllenorzesrolAdategyeztetesreVisszakuldveKomment))
                    {
                        komment = TanuloApaczaiResource.AdategyeztetesPalyazatKomment;
                    }
                    else
                    {
                        komment = palyazat.EllenorzesrolAdategyeztetesreVisszakuldveKomment;
                    }
                    break;
                case ApaczaiPalyazatStatuszEnum.Elfogadott:
                    if (string.IsNullOrWhiteSpace(palyazat.StatuszKomment))
                    {
                        komment = TanuloApaczaiResource.ElfogadottPalyazatKomment;
                    }
                    break;
                case ApaczaiPalyazatStatuszEnum.Elutasitott:
                    if (string.IsNullOrWhiteSpace(palyazat.StatuszKomment))
                    {
                        komment = TanuloApaczaiResource.ElutasitottPalyazatKomment;
                    }
                    break;
                case ApaczaiPalyazatStatuszEnum.Visszavont:
                    if (string.IsNullOrWhiteSpace(palyazat.StatuszKomment))
                    {
                        komment = TanuloApaczaiResource.VisszavontPalyazatKomment;
                    }
                    break;
                case ApaczaiPalyazatStatuszEnum.FelulvizsgalatrolAdategyeztetesreVisszakuldve:
                    if (string.IsNullOrWhiteSpace(palyazat.FelulvizsgalatrolAdategyeztetesreVisszakuldveKomment))
                    {
                        komment = TanuloApaczaiResource.AdategyeztetesPalyazatKomment;
                    }
                    else
                    {
                        komment = palyazat.FelulvizsgalatrolAdategyeztetesreVisszakuldveKomment;
                    }
                    break;
                case ApaczaiPalyazatStatuszEnum.TamogatasiSzerzodesselRendelkezoIntezmenytValtott:
                    komment = TanuloApaczaiResource.TamogatasiSzerzodesselRendelkezoIntezmenytValtottKomment;
                    break;
                default:
                    break;
            }

            return new PalyazatCo
            {
                Id = palyazat.Id,
                Palyazo = palyazat.Palyazo,
                TanevId = palyazat.TanevId,
                StatuszId = palyazat.StatuszId,
                StatuszNev = palyazat.StatuszNev,
                Letrehozva = palyazat.Letrehozva,
                StatuszKomment = palyazat.StatuszKomment,
                FellebbezesHatarido = palyazat.FellebbezesHatarido,
                HatranyosHelyzetHatarozatDatum = palyazat.HatranyosHelyzetHatarozatDatum,
                ErkeztetesiSzam = palyazat.StatuszErkeztetesiSzam,
                Iktatoszam = palyazat.StatuszIktatasiSzam,
                Komment = komment,
                Statusz = statusz
            };
        }

        public List<DokumentumCo> GetPalyazatDokumentumai(IKGRClient client, Guid tanuloIdpEgyediAzonosito)
        {
            var tanevSorszam = new TanevHelper(ConnectionType).GetTanevInfo().Sorszam;
            var fajlList = client.GetApaczaiPalyazatDokumentumai(tanevSorszam, tanuloIdpEgyediAzonosito);

            var coList = new List<DokumentumCo>();
            coList.AddRange(fajlList.Select(x => new DokumentumCo
            {
                Azonosito = x.FileServiceEgyediAzonosito,
                Kategoria = MapKgrDokumentumTipusToDokumentumKategoria(x.ApaczaiFileTipusId, x.FileServiceUtvonal),
                Nev = x.FileServiceUtvonal.Substring(x.FileServiceUtvonal.LastIndexOf("/") + 1),
                Datum = x.Letrehozva,
                EszaTipus = x.EszaTipus
            }));

            return coList;
        }

        public byte[] GetPalyazatDokumentuma(IKGRClient client, Guid tanuloIdpEgyediAzonosito, Guid fileId)
        {
            var tanevSorszam = new TanevHelper(ConnectionType).GetTanevInfo().Sorszam;
            return client.GetApaczaiPalyazatDokumentuma(tanevSorszam, tanuloIdpEgyediAzonosito, fileId);
        }

        public bool UploadPalyazatDokumentumBinaryMode(IKGRClient client, Guid tanuloIdpEgyediAzonosito, int dokumentumKategoriaId, UploadedFileCO uploadedFileCO)
        {
            var tanevSorszam = new TanevHelper(ConnectionType).GetTanevInfo().Sorszam;

            var apaczaiUploadRequest = new ApaczaiUploadFileRequestBinary
            {
                PostedFileName = uploadedFileCO.PostedFileName,
                PostedFileContentType = uploadedFileCO.PostedFileContentType,
                PostedFileCategory = MapDokumentumKategoriaToKgrDokumentumTipus((ApaczaiDokumentumTipusEnum)dokumentumKategoriaId),
                File = uploadedFileCO.PostedFile,
                ApaczaiDokumentumTipus = MapEszaTipus(uploadedFileCO),
            };

            return client.PostApaczaiPalyazatDokumentumBinaryFiles(tanevSorszam, tanuloIdpEgyediAzonosito, apaczaiUploadRequest);
        }

        public IEnumerable<PalyazatiEsemenyCo> GetPalyazatiEsemenyek(IKGRClient client, Guid tanuloIdpEgyediAzonosito)
        {
            var tanevSorszam = new TanevHelper(ConnectionType).GetTanevInfo().Sorszam;
            var palyazatTortenetList = client.GetApaczaiPalyazatTortenet(tanevSorszam, tanuloIdpEgyediAzonosito);
            var esemenyek = palyazatTortenetList.Select(t => new PalyazatiEsemenyCo
            {
                Cim = t.Cim,
                Datum = t.Datum,
                Megjegyzes = t.Megjegyzes,
                Statusz = MapKgrPalyazatStatuszIdToApaczaiStatusz(t.StatuszId)
            });
            return esemenyek;
        }

        public bool GetPalyazatVisszavonas(IKGRClient client, Guid tanuloIdpEgyediAzonosito)
        {
            var tanevSorszam = new TanevHelper(ConnectionType).GetTanevInfo().Sorszam;
            var palyazat = client.GetApaczaiVisszavonas(tanevSorszam, tanuloIdpEgyediAzonosito);
            return palyazat.Id.IsEntityId();
        }

        public List<IgenylesCo> GetIgenylesekCoList(IKGRClient client, IgenylesSearchCo searchCo, Guid intezmenyEgyediAzonosito)
        {
            var result = new List<IgenylesCo>();

            var tanevSorszam = new TanevHelper(ConnectionType).GetTanevInfo().Sorszam;
            var osszesIgenyles = client.GetIgenylesekModelList(tanevSorszam, intezmenyEgyediAzonosito);
            if (osszesIgenyles.Any())
            {
                var tanulokOsztalyaiDs = new TanuloHelper(ConnectionType).GetTanulokOsztalyaiByTanuloIdp(osszesIgenyles.Select(i => i.Palyazo.IdpEgyediAzonosito).Distinct());
                var tanulokOsztalyaiDict = tanulokOsztalyaiDs.Tables[0].AsEnumerable().Select(r => new
                {
                    TanuloIdp = r.Field<Guid>("TanuloIdp"),
                    OsztalyId = r.Field<int>("OsztalyId"),
                    OsztalyNev = r.Field<string>("OsztalyNev"),
                    EvfolyamId = r.Field<int>("EvfolyamId"),
                    EvfolyamNev = r.Field<string>("EvfolyamNev"),
                }).ToDictionary(t => t.TanuloIdp);

                var ret = osszesIgenyles.Where(i => tanulokOsztalyaiDict.Keys.Contains(i.Palyazo.IdpEgyediAzonosito)).Select(i => new IgenylesCo
                {
                    TanuloNeve = $"{i.Palyazo.CsaladiNev} {i.Palyazo.Utonev}",
                    OktatasiAzonosito = i.Palyazo.OktatasiAzonosito,
                    SzuletesiIdeje = i.Palyazo.SzuletesiIdo,
                    OsztalyId = tanulokOsztalyaiDict[i.Palyazo.IdpEgyediAzonosito].OsztalyId,
                    OsztalyNev = tanulokOsztalyaiDict[i.Palyazo.IdpEgyediAzonosito].OsztalyNev,
                    EvfolyamId = tanulokOsztalyaiDict[i.Palyazo.IdpEgyediAzonosito].EvfolyamId,
                    EvfolyamNev = tanulokOsztalyaiDict[i.Palyazo.IdpEgyediAzonosito].EvfolyamNev,
                    PalyazatAllapotaId = (int)MapKgrPalyazatStatuszIdToApaczaiStatusz(i.StatuszId),
                    PalyazatAllapotaNev = i.StatuszNev
                });

                if (searchCo.EvfolyamId.HasValue)
                {
                    ret = ret.Where(x => x.EvfolyamId == searchCo.EvfolyamId.Value);
                }

                if (!string.IsNullOrWhiteSpace(searchCo.OktatasiAzonosito))
                {
                    ret = ret.Where(x => x.OktatasiAzonosito.Contains(searchCo.OktatasiAzonosito));
                }

                if (searchCo.OsztalyId.HasValue)
                {
                    ret = ret.Where(x => x.OsztalyId == searchCo.OsztalyId.Value);
                }

                if (searchCo.PalyazatAllapotaId.HasValue)
                {
                    ret = ret.Where(x => x.PalyazatAllapotaId == searchCo.PalyazatAllapotaId.Value);
                }

                if (!string.IsNullOrWhiteSpace(searchCo.TanuloNeve))
                {
                    ret = ret.Where(x => x.TanuloNeve.Contains(searchCo.TanuloNeve));
                }

                result.AddRange(ret);
            }

            return result;
        }

        public List<TanuloApaczaiTanuloListaItemCo> GetTanuloiListaCoList(IKGRClient client, TanuloiListaSearchCo searchCo, Guid intezmenyEgyediAzonosito)
        {
            var coList = new TanuloHelper(ConnectionType).GetApaczaiTanuloiListaCoList(searchCo);
            var tanevSorszam = new TanevHelper(ConnectionType).GetTanevInfo().Sorszam;
            var beadottIgenylesek = client.GetIgenylesekModelList(tanevSorszam, intezmenyEgyediAzonosito);
            coList.ForEach(x =>
            {
                var kgrIgeny = beadottIgenylesek.SingleOrDefault(y => y.Palyazo.IdpEgyediAzonosito == x.IdpEgyediAzonosito);
                if (kgrIgeny != default)
                {
                    if (kgrIgeny.StatuszId != (int)KgrPalyazatStatuszEnum.ElfogadottVegleges)
                    {
                        x.Jogosultsag = false;
                        x.JuttatasOsszege = null;
                        x.NemJogosultsagOka_STR = $"<ul class=\"nemjogosultsagoka\"><li>{SzakkepzesiJuttatasokResource.ElutasitottPalyazat}</li></ul>";
                    }
                    x.PalyazatKgrAllapota = kgrIgeny.StatuszNev;
                }
                else
                {
                    x.Jogosultsag = false;
                    x.NemJogosultsagOka = 0;
                    x.NemJogosultsagOka_STR = string.Empty;
                    x.PalyazatKgrAllapota = SzakkepzesiJuttatasokResource.NincsErvenyesPalyazat;
                }
            });
            if (searchCo.IsCsakErvenyesPalyazattal)
            {
                coList.RemoveAll(x => x.PalyazatKgrAllapota == SzakkepzesiJuttatasokResource.NincsErvenyesPalyazat);
            }
            return coList;
        }

        public List<KifizetesCo> GetKifizetesekCoList(IKGRClient client, KifizetesSearchCo searchCo)
        {
            var tanevSorszam = new TanevHelper(ConnectionType).GetTanevInfo().Sorszam;
            var osszesKifizetes = client.GetKifizetesekModelList(tanevSorszam);
            var ret = new List<KifizetesCo>(osszesKifizetes.Select(x => new KifizetesCo
            {
                //TanuloNeve = model.TanuloNeve,
                //OktatasiAzonosito = model.OktatasiAzonosito,
                //SzuletesiIdeje = model.SzuletesiIdeje,
                //OsztalyId = model.OsztalyId,
                //OsztalyNev = model.OsztalyNev,
                //EvfolyamId = model.EvfolyamId,
                //EvfolyamNev = model.EvfolyamNev,
                //Jogosultsag = model.Jogosultsag,
                //NemJogosultsagOka = model.NemJogosultsagOka,
                //JuttatasOsszege = model.JuttatasOsszege,
            }));

            ret.AddRange(new List<KifizetesCo>{
                new KifizetesCo
                {
                    TanuloNeve = "minta aladár",
                    OktatasiAzonosito = "79999999999",
                    SzuletesiIdeje = new DateTime(2000, 10, 10),
                    OsztalyNev = "1.x",
                    OsztalyId = 1,
                    EvfolyamNev = "1",
                    EvfolyamId = 1,
                    Jogosultsag = "Igen",
                    JuttatasOsszege = 10000,
                    NemJogosultsagOka = "",
                },
                new KifizetesCo
                {
                    TanuloNeve = "minta béla",
                    OktatasiAzonosito = "79999999998",
                    SzuletesiIdeje = new DateTime(2000, 10, 10),
                    OsztalyNev = "1.x",
                    OsztalyId = 1,
                    EvfolyamNev = "1",
                    EvfolyamId = 1,
                    Jogosultsag = "Nem",
                    JuttatasOsszege = null,
                    NemJogosultsagOka = "Nem jogosult"
                },
            });

            IEnumerable<KifizetesCo> filtered = ret;
            if (searchCo.EvfolyamId.HasValue)
            {
                filtered = filtered.Where(x => x.EvfolyamId == searchCo.EvfolyamId.Value);
            }
            if (!string.IsNullOrWhiteSpace(searchCo.OktatasiAzonosito))
            {
                filtered = filtered.Where(x => x.OktatasiAzonosito.Contains(searchCo.OktatasiAzonosito));
            }
            if (searchCo.OsztalyId.HasValue)
            {
                filtered = filtered.Where(x => x.OsztalyId == searchCo.OsztalyId.Value);
            }
            if (!string.IsNullOrWhiteSpace(searchCo.TanuloNeve))
            {
                filtered = filtered.Where(x => x.TanuloNeve.Contains(searchCo.TanuloNeve));
            }
            if (searchCo.JuttatasOsszege.HasValue)
            {
                filtered = filtered.Where(x => x.JuttatasOsszege == searchCo.JuttatasOsszege.Value);
            }
            if (searchCo.Jogosultsag.HasValue)
            {
                filtered = filtered.Where(x => x.Jogosultsag == searchCo.Jogosultsag.Value.GetDisplayName());
            }

            return filtered.ToList();
        }

        public bool DeletePalyazatDokumentuma(IKGRClient client, Guid tanuloIdpEgyediAzonosito, Guid fileId)
        {
            var tanevSorszam = new TanevHelper(ConnectionType).GetTanevInfo().Sorszam;
            return client.DeleteApaczaiPalyazatDokumentuma(tanevSorszam, tanuloIdpEgyediAzonosito, fileId);
        }

        public bool Fellebbezes(IKGRClient client, Guid tanuloIdpEgyediAzonosito, string indoklas)
        {
            var tanevSorszam = new TanevHelper(ConnectionType).GetTanevInfo().Sorszam;
            return client.Fellebbezes(tanuloIdpEgyediAzonosito, tanevSorszam, indoklas);
        }

        public bool HasElfogadottPalyazatMasikIntezmenyByOktatasiAzonosito(IKGRClient client, Guid intezmenyEgyediAzonosito, int tanuloId)
        {
            var tanevSorszam = -1;
            string oktatasiAzonosito = null;
            Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var dalHandlerConnectionType = new DalHandlerConnectionType(ConnectionType, h);
                tanevSorszam = new TanevHelper(dalHandlerConnectionType).GetTanevInfo().Sorszam;
                oktatasiAzonosito = new FelhasznaloHelper(dalHandlerConnectionType).GetFelhasznaloOktatasiAzonosito(tanuloId);
            });
            return client.HasElfogadottPalyazatMasikIntezmenyByOktatasiAzonosito(intezmenyEgyediAzonosito, tanevSorszam, oktatasiAzonosito);
        }

        private ApaczaiDokumentumTipusEnum MapKgrDokumentumTipusToDokumentumKategoria(int kgrFileTypeId, string fileServiceUtvonal)
        {
            switch (kgrFileTypeId)
            {
                case 1:
                    return ApaczaiDokumentumTipusEnum.HatranyosHelyzetIgazolas;
                case 2:
                    return ApaczaiDokumentumTipusEnum.HozzajaruloNyilatkozat;
                case 3:
                    return ApaczaiDokumentumTipusEnum.ElozoTanevEvvegiBizonyitvany;
                case 5:
                    {
                        if (fileServiceUtvonal.Contains("_TamogatoiOkirat_"))
                        {
                            return ApaczaiDokumentumTipusEnum.TamogatoiOkirat;
                        }
                        else
                        {
                            return ApaczaiDokumentumTipusEnum.PalyazatiDontes;
                        }
                    }
                case 7:
                    return ApaczaiDokumentumTipusEnum.MentoriTamogatoNyilatkozat;
                case 8:
                    return ApaczaiDokumentumTipusEnum.EszaTipus;
                default:
                    return ApaczaiDokumentumTipusEnum.Egyeb;
            }
        }

        private int MapDokumentumKategoriaToKgrDokumentumTipus(ApaczaiDokumentumTipusEnum kategoriaId)
        {
            switch (kategoriaId)
            {
                case ApaczaiDokumentumTipusEnum.HatranyosHelyzetIgazolas:
                    return 1;
                case ApaczaiDokumentumTipusEnum.HozzajaruloNyilatkozat:
                    return 2;
                case ApaczaiDokumentumTipusEnum.ElozoTanevEvvegiBizonyitvany:
                    return 3;
                case ApaczaiDokumentumTipusEnum.MentoriTamogatoNyilatkozat:
                    return 7;
                case ApaczaiDokumentumTipusEnum.EszaBelepoNyilatkozat:
                    return 8;
                case ApaczaiDokumentumTipusEnum.EszaKilepoNyilatkozat:
                    return 8;
                //case ApaczaiDokumentumTipusEnum.PalyazatiDontes: return 5;
                default:
                    return 4;
            }
        }

        private ApaczaiPalyazatStatuszEnum MapKgrPalyazatStatuszIdToApaczaiStatusz(int? kgrStatuszId)
        {
            switch (kgrStatuszId)
            {
                case (int)KgrPalyazatStatuszEnum.Uj:
                case (int)KgrPalyazatStatuszEnum.EllenorzesAlatt:
                case (int)KgrPalyazatStatuszEnum.EllenorizveElfogadva:
                case (int)KgrPalyazatStatuszEnum.EllenorizveElutasitva:
                case (int)KgrPalyazatStatuszEnum.FelulvizsgalatAlatt:
                case (int)KgrPalyazatStatuszEnum.FelulvizsgalvaElfogadva:
                case (int)KgrPalyazatStatuszEnum.FelulvizsgalvaElutasitva:
                case (int)KgrPalyazatStatuszEnum.Fellebbezve:
                case (int)KgrPalyazatStatuszEnum.DontesiJavaslatraElfogadottAtadva:
                case (int)KgrPalyazatStatuszEnum.DontesiJavaslatraElutasitottAtadva:
                case (int)KgrPalyazatStatuszEnum.FelulvizsgalbaElutasitvaKerettullepes:
                case (int)KgrPalyazatStatuszEnum.DontesiJavaslatraElutasitottKerettullepesAtadva:
                    return ApaczaiPalyazatStatuszEnum.Bekuldott;
                case (int)KgrPalyazatStatuszEnum.EllenorzesrolAdategyeztetesreVisszakuldve:
                    return ApaczaiPalyazatStatuszEnum.AdategyeztetesreVisszakuldve;
                case (int)KgrPalyazatStatuszEnum.FelulvizsgalatrolAdategyeztetesreVisszakuldve:
                    return ApaczaiPalyazatStatuszEnum.FelulvizsgalatrolAdategyeztetesreVisszakuldve;
                case (int)KgrPalyazatStatuszEnum.ElfogadottVegleges:
                    return ApaczaiPalyazatStatuszEnum.Elfogadott;
                case (int)KgrPalyazatStatuszEnum.ElutasitottVegleges:
                case (int)KgrPalyazatStatuszEnum.ElutasitottVeglegesKerettullepes:
                    return ApaczaiPalyazatStatuszEnum.Elutasitott;
                case (int)KgrPalyazatStatuszEnum.IntezmenyValtas:
                    return ApaczaiPalyazatStatuszEnum.TamogatasiSzerzodesselRendelkezoIntezmenytValtott;
                case (int)KgrPalyazatStatuszEnum.Visszavont:
                    return ApaczaiPalyazatStatuszEnum.Visszavont;
                default:
                    return ApaczaiPalyazatStatuszEnum.NemMeghatarozott;
            }
        }

        private string MapEszaTipus(UploadedFileCO uploadedFileCO)
        {
            if (uploadedFileCO.ApaczaiDokumentumTipus != null)
            {
                switch (uploadedFileCO.ApaczaiDokumentumTipus)
                {
                    case ApaczaiDokumentumTipusEnum.EszaBelepoNyilatkozat:
                        return TanuloApaczaiResource.EszaBelepoNyilatkozat;
                    case ApaczaiDokumentumTipusEnum.EszaKilepoNyilatkozat:
                        return TanuloApaczaiResource.EszaKilepoNyilatkozat;
                    default:
                        return string.Empty;
                }
            }

            return string.Empty;
        }
    }
}