using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Web.Mvc;
using Kreta.BusinessLogic.Classes;
using Kreta.BusinessLogic.HelperClasses;
using Kreta.BusinessLogic.Logic;
using Kreta.BusinessLogic.Utils;
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.Framework;
using Kreta.Resources;
using Kreta.Web.Helpers.Extension;
using OfficeOpenXml;

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

        public void UpdateAMITantargySablonId(int id, int amiSablonId)
        {
            Dal.CustomConnection.Run(ConnectionType, h =>
           {
               var dal = h.Tantargy();
               var tantargy = dal.GetTantargy(id);
               tantargy.AMITantargySablonId = amiSablonId;

               dal.FullUpdate(tantargy);
           });
        }

        public int CreateAMITantargy(int amiSablonId, string nev)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var dal = h.Tantargy();
                var targyEnt = dal.GetTantargy();
                targyEnt.Gyakorlati = false;
                targyEnt.Nev = nev;
                targyEnt.TargyKategoria = (int)TargyKategoriaTipusEnum.muveszetek;
                targyEnt.AltantargykentNyomtatvanyban = false;
                targyEnt.Fotargye = false;
                targyEnt.NevNyomtatvanyban = nev;

                targyEnt.FotargyId = -1;
                targyEnt.IsAmiTargy = true;

                targyEnt.TanevId = TanevId;
                targyEnt.AMITantargySablonId = amiSablonId;

                targyEnt.Sorszam = 0;

                targyEnt.IsTanulmanyiAtlagbaNemSzamit = false;

                targyEnt.IsOsztalyzattalErtekelheto = true;
                targyEnt.IsSzovegesenErtekelheto = true;
                targyEnt.IsSzazalekosanErtekelheto = true;

                targyEnt.IsOsztalynaplobaNemLatszik = false;
                targyEnt.IsOsztalyOrarendbeNemLatszik = false;

                targyEnt.EslTantargyKategoriaId = (int)ESLTantargykategoriaEnum.EgyebTantargy;

                dal.Insert(targyEnt);

                return targyEnt.ID;
            });
        }

        public void SaveOrUpdateTantargy(TantargyCO co)
        {
            Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var dal = h.Tantargy();
                var targyEnt = dal.GetTantargy();
                if (co.ID.IsEntityId())
                {
                    targyEnt = dal.GetTantargy(co.ID.Value);
                }

                targyEnt.Gyakorlati = co.GyakorlatiTargy;
                targyEnt.IsAmiTargy = co.IsAmiTargy;
                targyEnt.Nev = co.TantargyNev;
                targyEnt.IsKollegiumTargy = co.IsKollegiumiTargy;
                targyEnt.IsEgymiTargy = co.IsEgymiTargy;
                targyEnt.IsFelnottOktatasTargy = co.IsFelnottOktatasTargy;
                targyEnt.IsNincsBeloleOra = co.IsNincsBeloleOra;
                targyEnt.IsTanulmanyiAtlagbaNemSzamit = co.IsTanulmanyiAtlagbaNemSzamit;
                targyEnt.IsOsztalynaplobaNemLatszik = co.IsOsztalynaplobanNemJelenikMeg;
                targyEnt.IsOsztalyOrarendbeNemLatszik = !co.IsOsztalyokOrarendjebenMegjelenik;
                targyEnt.IsMszgTargy = co.IsMszgTargy;

                if (co.TargyKategoria != null)
                {
                    targyEnt.TargyKategoria = (int)co.TargyKategoria;
                }

                if (co.ESLTantargykategoria != null)
                {
                    targyEnt.EslTantargyKategoriaId = (int)co.ESLTantargykategoria;
                }

                targyEnt.AltantargykentNyomtatvanyban = co.AltantargyNyomtatvanyban;
                targyEnt.Fotargye = co.isFoTargy;

                targyEnt.NevNyomtatvanyban = string.IsNullOrWhiteSpace(co.NevNyomtatvanyban) ? co.TantargyNev : co.NevNyomtatvanyban;

                targyEnt.Rovidnev = co.TantargyRovidNev;

                targyEnt.AngolNev = co.TantargyAngolNev;
                targyEnt.NemetNev = co.TantargyNemetNev;
                targyEnt.Megjegyzes = co.Megjegyzes;
                targyEnt.Gyakorlatigenyesseg = co.Gyakorlatigenyesseg;

                if (co.FoTargyID.HasValue && co.FoTargyID > 0)
                {
                    targyEnt.FotargyId = (int)co.FoTargyID;
                }
                else if (targyEnt.FotargyId > 0)
                {
                    targyEnt.FotargyId = -1;
                }

                if (co.isFoTargy)
                {
                    targyEnt.FotargyId = -1;
                }

                targyEnt.TanevId = TanevId;
                targyEnt.Sorszam = co.Sorszam;

                targyEnt.IsOsztalyzattalErtekelheto = co.IsOsztalyzattalErtekelheto;
                targyEnt.IsSzovegesenErtekelheto = co.IsSzovegesenErtekelheto;
                targyEnt.IsSzazalekosanErtekelheto = co.IsSzazalekosanErtekelheto;

                if (co.IsAmiTargy)
                {
                    targyEnt.MufajTipusId = co.MufajTipusId;
                    targyEnt.TanszakTipusId = co.TanszakTipusId;
                    targyEnt.MuveszetiAgId = co.MuveszetiAgId;
                }
                else
                {
                    targyEnt.MufajTipusId = null;
                    targyEnt.TanszakTipusId = null;
                    targyEnt.MuveszetiAgId = null;
                }

                if (co.ID.IsEntityId())
                {
                    dal.FullUpdate(targyEnt);

                    if (!string.IsNullOrWhiteSpace(co.TantargyNemetNev))
                    {
                        UpdateTantargyNyelv(dal, targyEnt, AnyanyelvEnum.nemet, co.TantargyNemetNev);
                    }

                    if (!string.IsNullOrWhiteSpace(co.TantargyHorvatNev))
                    {
                        UpdateTantargyNyelv(dal, targyEnt, AnyanyelvEnum.horvat, co.TantargyHorvatNev);
                    }

                    if (!string.IsNullOrWhiteSpace(co.TantargyRomanNev))
                    {
                        UpdateTantargyNyelv(dal, targyEnt, AnyanyelvEnum.roman, co.TantargyRomanNev);
                    }

                    if (!string.IsNullOrWhiteSpace(co.TantargySzerbNev))
                    {
                        UpdateTantargyNyelv(dal, targyEnt, AnyanyelvEnum.szerb, co.TantargySzerbNev);
                    }
                }
                else
                {
                    dal.Insert(targyEnt);

                    if (!string.IsNullOrWhiteSpace(co.TantargyNemetNev))
                    {
                        InsertTantargyNyelv(dal, targyEnt, AnyanyelvEnum.nemet, co.TantargyNemetNev);
                    }

                    if (!string.IsNullOrWhiteSpace(co.TantargyHorvatNev))
                    {
                        InsertTantargyNyelv(dal, targyEnt, AnyanyelvEnum.horvat, co.TantargyHorvatNev);
                    }

                    if (!string.IsNullOrWhiteSpace(co.TantargyRomanNev))
                    {
                        InsertTantargyNyelv(dal, targyEnt, AnyanyelvEnum.roman, co.TantargyRomanNev);
                    }

                    if (!string.IsNullOrWhiteSpace(co.TantargySzerbNev))
                    {
                        InsertTantargyNyelv(dal, targyEnt, AnyanyelvEnum.szerb, co.TantargySzerbNev);
                    }
                }
            });
        }

        public TantargyCO GetTantargyById(int targyId)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
           {
               var dal = h.Tantargy();
               var targy = dal.GetTantargy(targyId);

               var nyelvek = targy.TantargyNyelv.Where(x => !x.Torolt).ToList();
               var nemet = nyelvek.FirstOrDefault(x => x.NyelvId == (int)AnyanyelvEnum.nemet);
               var horvat = nyelvek.FirstOrDefault(x => x.NyelvId == (int)AnyanyelvEnum.horvat);
               var roman = nyelvek.FirstOrDefault(x => x.NyelvId == (int)AnyanyelvEnum.roman);
               var szerb = nyelvek.FirstOrDefault(x => x.NyelvId == (int)AnyanyelvEnum.szerb);

               var co = new TantargyCO
               {
                   ID = targy.ID,
                   GyakorlatiTargy = targy.Gyakorlati,
                   TantargyNev = targy.Nev,
                   TantargyRovidNev = targy.Rovidnev,
                   TargyKategoria = Convert.ToInt32(targy.TargyKategoria),
                   TargyKategoriaNev = targy.TargyKategoria.GetDisplayName<TargyKategoriaTipusEnum>(TanevId),
                   ESLTantargykategoria = Convert.ToInt32(targy.EslTantargyKategoriaId),
                   ESLTantargykategoriaNev = targy.EslTantargyKategoriaId.GetDisplayName<ESLTantargykategoriaEnum>(TanevId),
                   //Megbeszéltük
                   AltantargyNyomtatvanyban = /*targy.Fotargy != null && targy.Fotargy.ID > 0 ? */targy.AltantargykentNyomtatvanyban, // : false;
                   NevNyomtatvanyban = targy.NevNyomtatvanyban,
                   isFoTargy = targy.Fotargye,
                   TanevID = targy.TanevId,
                   Tanev = targy.Tanev.Nev,
                   TantargyAngolNev = targy.AngolNev,
                   TantargyNemetNev = nemet?.Nev,
                   TantargyHorvatNev = horvat?.Nev,
                   TantargyRomanNev = roman?.Nev,
                   TantargySzerbNev = szerb?.Nev,
                   Sorszam = targy.Sorszam,
                   Megjegyzes = targy.Megjegyzes,
                   Gyakorlatigenyesseg = targy.Gyakorlatigenyesseg,
                   IsAmiTargy = targy.IsAmiTargy,
                   IsKollegiumiTargy = targy.IsKollegiumTargy,
                   IsEgymiTargy = targy.IsEgymiTargy,
                   IsFelnottOktatasTargy = targy.IsFelnottOktatasTargy,
                   IsNincsBeloleOra = targy.IsNincsBeloleOra,
                   IsOsztalyzattalErtekelheto = targy.IsOsztalyzattalErtekelheto,
                   IsSzovegesenErtekelheto = targy.IsSzovegesenErtekelheto,
                   IsSzazalekosanErtekelheto = targy.IsSzazalekosanErtekelheto,
                   IsTanulmanyiAtlagbaNemSzamit = targy.IsTanulmanyiAtlagbaNemSzamit,
                   IsOsztalynaplobanNemJelenikMeg = targy.IsOsztalynaplobaNemLatszik,
                   IsOsztalyokOrarendjebenMegjelenik = !targy.IsOsztalyOrarendbeNemLatszik,
                   IsMszgTargy = targy.IsMszgTargy,
                   MufajTipusId = targy.MufajTipusId,
                   TanszakTipusId = targy.TanszakTipusId,
                   MuveszetiAgId = targy.MuveszetiAgId,
               };

               if (targy.Fotargy != null && targy.Fotargy.ID > 0)
               {
                   co.FoTargyID = targy.FotargyId;
                   co.FoTargyNev = targy.Fotargy.Nev;
               }

               return co;
           });
        }

        public void DeleteTantargyById(int targyId, bool updateTanoraEvesSorszam = true)
        {
            Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var dal = h.Tantargy();
                var tantargy = dal.GetTantargy(targyId);

                if ((tantargy.Nev == TantargyResource.DualisKepzes)
                    || (tantargy.Nev == TantargyResource.ApaczaiKonzultacio))
                {
                    return;
                }

                dal.Delete(tantargy, IntezmenyId, TanevId, updateTanoraEvesSorszam);
            });
        }

        public bool IsGyakorlatiTantargy(int tantargyId)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
           {
               var dal = h.Tantargy(GridParameters);
               return dal.IsGyakorlatiTantargy(tantargyId);
           });
        }

        public IDictionary<string, string> GetTantargyakForDDL(int? tanarId = null, bool filterNincsBeloleOra = false, int? szervezetTipusEnumId = null, int? felhasznaloId = null, bool addMagatartasSzogalom = false, bool isSzakkepzo = false)
        {
            var dataSet = Dal.CustomConnection.Run(ConnectionType, h => h.Tantargy(GridParameters).GetTantargyDataSet(TanevId, tanarId, filterNincsBeloleOra));

            if (szervezetTipusEnumId.IsEntityId() && felhasznaloId.IsEntityId())
            {
                var szervezetHelper = new SzervezetHelper(ConnectionType);
                var alkalmazottSzervezetId = szervezetHelper.GetAlkalmazottSzervezetId(felhasznaloId.Value);
                var lathatoSzervezetIdList = szervezetHelper.GetLathatoSzervezetIdList(alkalmazottSzervezetId, SzervezetAdatokHalmazaEnum.SzervezetEsAlSzervezetek);
                var dualisKepzesTantargyId = new TantargyHelper(ConnectionType).GetDualisKepzesTantargyId();

                dataSet.Tables[0].Rows.Cast<DataRow>().Where(dataRow =>
                {
                    var szervezetId = SDAConvert.ToNullableInt32(dataRow["SzervezetId"]);
                    if (szervezetId.IsEntityId())
                    {
                        return !lathatoSzervezetIdList.Contains(szervezetId.Value);
                    }

                    return SDAConvert.ToInt32(dataRow["ID"]) != dualisKepzesTantargyId;
                }).ToList().ForEach(r => r.Delete());
                dataSet.AcceptChanges();
            }

            var result = new Dictionary<string, string>();
            if (addMagatartasSzogalom)
            {
                result.Add("-1", EnumsResource.MagatartasSzorgalom);
            }

            var items = LogicUtil.CreateDropdownContent(dataSet, "ID", "TantargyNev");
            foreach (var item in items)
            {
                result.Add(item.Key, item.Value);
            }

            if (!isSzakkepzo)
            {
                result.RemoveDictionaryItemByValue(TantargyResource.ApaczaiKonzultacio);
            }

            if (szervezetTipusEnumId != (int)SzervezetTipusEnum.Dualis)
            {
                result.RemoveDictionaryItemByValue(TantargyResource.DualisKepzes);
            }

            return result;
        }

        public List<SelectListItem> GetTantargyakForComboBox(int? tanarId = null, bool isSzakkepzo = false, bool isFromSzervezet = false)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {               
                var dal = h.Tantargy(GridParameters);
                var dataset = dal.GetTantargyDataSet(TanevId, tanarId);

                var result = dataset.CreateMvcGroupedSelectListItem("ID", "TantargyNev", "Targykategoria_DNAME");

                if (!isSzakkepzo)
                {
                    result.RemoveAll(_ => _.Text == TantargyResource.ApaczaiKonzultacio);
                }

                if (!isFromSzervezet)
                {
                    result.RemoveAll(_ => _.Text == TantargyResource.DualisKepzes);
                }

                return result;
            });
        }

        public IDictionary<string, string> GetFotargyak(int kiveve = 0)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
           {
               var dal = h.Tantargy();
               var kiveveId = kiveve > 0 ? (int?)kiveve : null;
               return LogicUtil.CreateDropdownContent(h.Tantargy(GridParameters).GetFotargyak(kiveveId), "ID", "Nev");
           });
        }

        public IDictionary<string, string> GetFotargyakByTanev()
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
           {
               return LogicUtil.CreateDropdownContent(h.Tantargy(GridParameters).GetFotargyakByTanev(TanevId), "ID", "Nev");
           });
        }

        public List<SelectListItem> GetTanarTantargyaiByTanevCsoportositva(string egyebGroupName = null, bool filterNincsBeloleOra = false, bool isFromSzervezet = false, bool isSzakkepzo = false)
        {         
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                /*Egyéb tantárgyak*/
                if (string.IsNullOrWhiteSpace(egyebGroupName))
                {
                    egyebGroupName = StringResourcesUtil.GetString(3350);
                }

                var ds = h.Tantargy().GetTanarTantargyaiByTanevCsoportositva(TanevId, egyebGroupName, filterNincsBeloleOra);
                var result = ds.CreateMvcGroupedSelectListItem("ID", "TantargyNev", "GroupName");

                if (!isSzakkepzo)
                {
                    result.RemoveAll(s => s.Text == TantargyResource.ApaczaiKonzultacio);
                }

                if (!isFromSzervezet)
                {
                    result.RemoveAll(s => s.Text == TantargyResource.DualisKepzes);
                }

                return !isFromSzervezet ? result : result.Where(x => x.Text == TantargyResource.DualisKepzes).ToList();
            });
        }

        public void TantargyTobbesModify(TantargyTobbesModositasCO co)
        {
            Dal.CustomConnection.Run(ConnectionType, h =>
           {
               var dal = h.Tantargy();
               var tantargy = dal.GetTantargy(co.TantargyId);

               if ((tantargy.Nev == TantargyResource.DualisKepzes)
                || (tantargy.Nev == TantargyResource.ApaczaiKonzultacio))
               {
                   return;
               }

               if (co.TargyKategoria.HasValue)
               {
                   tantargy.TargyKategoria = co.TargyKategoria.Value;
               }

               if (co.EslTargyKategoria.HasValue)
               {
                   tantargy.EslTantargyKategoriaId = co.EslTargyKategoria.Value;
               }

               if (co.FoTargyId.HasValue)
               {
                   tantargy.FotargyId = co.FoTargyId.Value;
               }

               if (co.FoTargy.HasValue)
               {
                   tantargy.Fotargye = co.FoTargy.Value;

                   if (co.FoTargy.Value)
                   {
                       tantargy.FotargyId = -1;
                   }
               }

               if (co.GyakorlatiTargy.HasValue)
               {
                   tantargy.Gyakorlati = co.GyakorlatiTargy.Value;
               }

               if (co.IsAmiTargy.HasValue)
               {
                   tantargy.IsAmiTargy = co.IsAmiTargy.Value;
               }

               if (co.IsMszgTargy.HasValue)
               {
                   tantargy.IsMszgTargy = co.IsMszgTargy.Value;
               }

               if (co.IsKollegiumiTargy.HasValue)
               {
                   tantargy.IsKollegiumTargy = co.IsKollegiumiTargy.Value;
               }

               if (co.IsFelnottoktatasTargy.HasValue)
               {
                   tantargy.IsFelnottOktatasTargy = co.IsFelnottoktatasTargy.Value;
               }

               if (co.IsNincsBeloleOra.HasValue)
               {
                   tantargy.IsNincsBeloleOra = co.IsNincsBeloleOra.Value;
               }

               if (co.IsEgymiTargy.HasValue)
               {
                   tantargy.IsEgymiTargy = co.IsEgymiTargy.Value;
               }

               if (co.AltantargykentNyomtatvanyban.HasValue)
               {
                   tantargy.AltantargykentNyomtatvanyban = co.AltantargykentNyomtatvanyban.Value;
               }

               if (co.Sorszam.HasValue)
               {
                   tantargy.Sorszam = co.Sorszam.Value;
               }
               dal.FullUpdate(tantargy);
           });
        }

        public List<string> GetFotargyhozTartozikAltargy(List<int> tantargyIdList)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
           {
               var dal = h.Tantargy();
               var dataSet = dal.GetFotargyhozTartozoAltargyak(tantargyIdList);
               var tantargyakEnumerableList = dataSet.Tables[0].AsEnumerable();

               var egyediFotargyak = tantargyakEnumerableList.GroupBy(x => x.Field<string>(0)).Select(x => x.Key).ToList();

               var errorList = new List<string>();
               foreach (var fotargy in egyediFotargyak)
               {
                   var altargyList = tantargyakEnumerableList.Where(x => x.Field<string>(0).Equals(fotargy)).Select(s => s.Field<string>(1)).ToList();
                   if (altargyList.Any())
                   {
                       errorList.Add($"{TantargyResource.Fotargy}: {fotargy} - {TantargyResource.Altantargy}: {string.Join(", ", altargyList)}");
                   }
               }

               return errorList;
           });
        }

        #region Export

        public MemoryStream GetExportTantargyakMindenAdataExcelExport(
            string tantargyNev = null,
            int? tantargyKategoriaId = null,
            int? eslTargykategoriaTipusId = null,
            int? isErtekelesKorlatozva = null,
            int? isFotargy = null,
            int? fotargyId = null,
            int? isGyakorlati = null,
            string rovidNev = null,
            string bizonyitvanyNev = null,
            int? isAltantargykentBizonyitvanyban = null,
            int? isNincsBeloleOra = null,
            int? isOsztalyNaplobanNemJelenikMeg = null,
            int? isOsztalyokOrarendjebenMegjelenik = null,
            int? isTanulmanyiAtlagbaSzamit = null,
            int? isAmiTargy = null,
            int? isKollegiumTargy = null,
            int? isEgymiTargy = null,
            int? isFelnottoktatasTargy = null,
            int? isMszgTargy = null,
            string angolNev = null,
            string nemetNev = null,
            string horvatNev = null,
            string romanNev = null,
            string szerbNev = null,
            bool? nincsTantargykategoria = null,
            bool? isFromSzervezet = null,
            bool? isSzakkepzo = null)
        {
            return Dal.CustomConnection.Run(ConnectionType,
                h =>
                {
                    var dal = h.Tantargy();

                    var dataSet = dal.GetExportTantargyakMindenAdataExcelExport(TanevId,
                        tantargyNev,
                        tantargyKategoriaId,
                        eslTargykategoriaTipusId,
                        isErtekelesKorlatozva,
                        isFotargy,
                        fotargyId,
                        isGyakorlati,
                        rovidNev,
                        bizonyitvanyNev,
                        isAltantargykentBizonyitvanyban,
                        isNincsBeloleOra,
                        isOsztalyNaplobanNemJelenikMeg,
                        isOsztalyokOrarendjebenMegjelenik,
                        isTanulmanyiAtlagbaSzamit,
                        isAmiTargy,
                        isKollegiumTargy,
                        isEgymiTargy,
                        isFelnottoktatasTargy,
                        isMszgTargy,
                        angolNev,
                        nemetNev,
                        horvatNev,
                        romanNev,
                        szerbNev,
                        nincsTantargykategoria);
                    var dataTable = dataSet.Tables[0];

                    dataTable.Columns.Remove("KategoriaOrder");
                    dataTable.Columns.Remove("NevOrder");

                    if (isSzakkepzo.HasValue && !isSzakkepzo.Value)
                    {
                        dataTable = RemoveTantargyRowsByColumnValue(dataTable, TantargyResource.ApaczaiKonzultacio);
                    }

                    if (isFromSzervezet.HasValue && !isFromSzervezet.Value)
                    {
                        dataTable = RemoveTantargyRowsByColumnValue(dataTable, TantargyResource.DualisKepzes);
                    }

                    ExportLogic.TryCreateHeaderIfNotExist(dataTable);

                    var stream = new MemoryStream();

                    using (var excel = new ExcelPackage(stream))
                    {
                        var workSheet = excel.Workbook.Worksheets.Add(TantargyResource.TantargyakMindenAdata);

                        workSheet.Cells[1, 1].LoadFromDataTable(dataTable, true);

                        ExportLogic.SetHeaderStyles(workSheet.Cells[1, 1, 1, dataTable.Columns.Count]);

                        workSheet.Cells.AutoFitColumns();
                        excel.Save();
                    }

                    stream.Position = 0;

                    return stream;
                });
        }

        private DataTable RemoveTantargyRowsByColumnValue(DataTable dataTable, string value)
        {
            var columnIndex = dataTable.Columns.IndexOf($"{TantargyResource.TantargyNev}");

            foreach (DataRow row in dataTable.Rows)
            {
                if (row[columnIndex].ToString() == value)
                    row.Delete();
            }

            dataTable.AcceptChanges();

            return dataTable;
        }

        #endregion Export

        public List<TantargyItemCo> GetTantargyCoList(bool isRendezoOszlopokKell = false)
        {
            var dataSet = Dal.CustomConnection.Run(ConnectionType, dalHandler => dalHandler.Tantargy().GetTantargyDataSet(TanevId, isRendezoOszlopokKell));

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

            return result;
        }

        public List<TantargyItemCo> GetTantargyCoList(TantargySearchCo searchCo)
        {
            var ds = Dal.CustomConnection.Run(ConnectionType, h => h.Tantargy().GetTantargyDataSet(TanevId, false));
            var result = new List<TantargyItemCo>();
            foreach (var dataRow in ds.Tables[0].AsEnumerable())
            {
                result.Add(new TantargyItemCo(dataRow, false));
            }
            return FilterTantargyItemCoList(result, searchCo);
        }

        public (int?, int?, string) GetTantargyAMISablonhoz(int amiTantargySablonId)
        {
            int? tantargyId = null;
            int? amiTantargyId = null;
            var tantargyNev = string.Empty;

            return Dal.CustomConnection.Run(ConnectionType, h =>
           {
               var ds = h.Tantargy().GetTantargyAMISablonhoz(TanevId, amiTantargySablonId);
               foreach (DataRow row in ds.Tables[0].Rows)
               {
                   tantargyId = SDAConvert.ToNullableInt32(row["TantargyId"]);
                   amiTantargyId = SDAConvert.ToNullableInt32(row["AMITantargyId"]);
                   tantargyNev = SDAConvert.ToString(row["TantargyNev"]);

                   break;
               }

               return (tantargyId, amiTantargyId, tantargyNev);
           });
        }

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

        public List<string> GetTantargyakEgyesErtekelessel(List<int> tantargyIdList)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
           {
               var dal = h.Tantargy();
               var dataSet = dal.GetTantargyakEgyesErtekelessel(TanevId, IntezmenyId, tantargyIdList);

               var tantargyak = dataSet.Tables[0].AsEnumerable()
                   .Select(r => r.Field<string>(0))
                   .ToList();

               return tantargyak;
           });
        }

        public List<string> GetTantargyakNincsBeloleOra()
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                var dal = h.Tantargy();
                return dal.GetTantargyakNincsBeloleOra(TanevId).Tables[0].AsEnumerable()
                    .Select(r => r.Field<string>("TantargyNev")).ToList();
            });
        }

        private void InsertTantargyNyelv(ITantargyDal dal, ITantargy entity, AnyanyelvEnum nyelvEnum, string value)
        {
            var targyNyelv = dal.GetTantargyNyelv();

            targyNyelv.Nev = value;
            targyNyelv.NyelvId = (int)nyelvEnum;
            targyNyelv.TantargyId = entity.ID;
            targyNyelv.TanevId = entity.TanevId;
            targyNyelv.IntezmenyId = entity.IntezmenyId;

            dal.InsertNyelv(targyNyelv);
        }

        private void UpdateTantargyNyelv(ITantargyDal dal, ITantargy entity, AnyanyelvEnum nyelvEnum, string value)
        {
            var nyelvEntity = entity.TantargyNyelv.Where(x => x.NyelvId == (int)nyelvEnum).FirstOrDefault();
            if (nyelvEntity != null)
            {
                nyelvEntity.Nev = value;
                dal.FullUpdateNyelv(nyelvEntity);
            }
            else
            {
                InsertTantargyNyelv(dal, entity, nyelvEnum, value);
            }
        }

        private List<TantargyItemCo> FilterTantargyItemCoList(List<TantargyItemCo> coList, TantargySearchCo searchCo)
        {
            if (searchCo == null)
            {
                return coList;
            }

            IEnumerable<TantargyItemCo> result = coList;

            if (!string.IsNullOrWhiteSpace(searchCo.TantargyNev))
            {
                result = result.Where(x => x.Nev.ToLower().RemoveDiacritics().Contains(searchCo.TantargyNev.ToLower().RemoveDiacritics()));
            }
            if (searchCo.TantargyKategoriaID.HasValue)
            {
                result = result.Where(x => x.TargykategoriaTipusId == searchCo.TantargyKategoriaID.Value);
            }
            if (searchCo.EslTargykategoriaTipusId.HasValue)
            {
                result = result.Where(x => x.EslTargykategoriaTipusId == searchCo.EslTargykategoriaTipusId.Value);
            }
            if (searchCo.IsErtekelesKorlatozva.HasValue)
            {
                result = result.Where(x => x.IsErtekelesKorlatozva == searchCo.IsErtekelesKorlatozva.ToBool());
            }
            if (searchCo.IsFotargy.HasValue)
            {
                result = result.Where(x => x.IsFotargy == searchCo.IsFotargy.ToBool());
            }
            if (searchCo.KeresesFotargyID.HasValue)
            {
                result = result.Where(x => x.FotargyId == searchCo.KeresesFotargyID.Value);
            }
            if (searchCo.IsGyakorlati.HasValue)
            {
                result = result.Where(x => x.IsGyakorlatiTargy == searchCo.IsGyakorlati.ToBool());
            }
            if (searchCo.IsAltantargykentBizonyitvanyban.HasValue)
            {
                result = result.Where(x => x.IsAltantargykentBizonyitvanyban == searchCo.IsAltantargykentBizonyitvanyban.ToBool());
            }

            if (searchCo.IsNincsBeloleOra.HasValue)
            {
                result = result.Where(x => x.IsNincsBeloleOra == searchCo.IsNincsBeloleOra.ToBool());
            }

            if (searchCo.IsOsztalyNaplobanNemJelenikMeg.HasValue)
            {
                result = result.Where(x => x.IsOsztalyNaplobanNemJelenikMeg == searchCo.IsOsztalyNaplobanNemJelenikMeg.ToBool());
            }

            if (searchCo.IsOsztalyokOrarendjebenMegjelenik.HasValue)
            {
                result = result.Where(x => x.IsOsztalyokOrarendjebenMegjelenik == searchCo.IsOsztalyokOrarendjebenMegjelenik.ToBool());
            }

            if (searchCo.IsTanulmanyiAtlagbaSzamit.HasValue)
            {
                result = result.Where(x => x.IsTanulmanyiAtlagbaSzamit == searchCo.IsTanulmanyiAtlagbaSzamit.ToBool());
            }

            if (searchCo.IsAmiTargy.HasValue)
            {
                result = result.Where(x => x.IsAmiTargy == searchCo.IsAmiTargy.ToBool());
            }

            if (searchCo.IsKollegiumTargy.HasValue)
            {
                result = result.Where(x => x.IsKollegiumTargy == searchCo.IsKollegiumTargy.ToBool());
            }

            if (searchCo.IsEgymiTargy.HasValue)
            {
                result = result.Where(x => x.IsEgymiTargy == searchCo.IsEgymiTargy.ToBool());
            }

            if (searchCo.IsFelnottoktatasTargy.HasValue)
            {
                result = result.Where(x => x.IsFelnottoktatasTargy == searchCo.IsFelnottoktatasTargy.ToBool());
            }

            if (searchCo.IsMszgTargy.HasValue)
            {
                result = result.Where(x => x.IsMszgTargy == searchCo.IsMszgTargy.ToBool());
            }

            if (!string.IsNullOrWhiteSpace(searchCo.AngolNev))
            {
                result = result.Where(x => x.AngolNev?.ToLower().Contains(searchCo.AngolNev.ToLower()) ?? false);
            }

            if (!string.IsNullOrWhiteSpace(searchCo.NemetNev))
            {
                result = result.Where(x => x.NemetNev?.ToLower().Contains(searchCo.NemetNev.ToLower()) ?? false);
            }

            if (!string.IsNullOrWhiteSpace(searchCo.HorvatNev))
            {
                result = result.Where(x => x.HorvatNev?.ToLower().Contains(searchCo.HorvatNev.ToLower()) ?? false);
            }

            if (!string.IsNullOrWhiteSpace(searchCo.RomanNev))
            {
                result = result.Where(x => x.RomanNev?.ToLower().Contains(searchCo.RomanNev.ToLower()) ?? false);
            }

            if (!string.IsNullOrWhiteSpace(searchCo.SzerbNev))
            {
                result = result.Where(x => x.SzerbNev?.ToLower().Contains(searchCo.SzerbNev.ToLower()) ?? false);
            }

            if (!string.IsNullOrWhiteSpace(searchCo.RovidNev))
            {
                result = result.Where(x => x.RovidNev.Contains(searchCo.RovidNev));
            }
            if (!string.IsNullOrWhiteSpace(searchCo.BizonyitvanyNev))
            {
                result = result.Where(x => x.BizonyitvanyNev.Contains(searchCo.BizonyitvanyNev));
            }
            if (searchCo.nincsTantargykategoria.HasValue && searchCo.nincsTantargykategoria.Value)
            {
                result = result.Where(x => x.TargykategoriaTipusId == (int)TargyKategoriaTipusEnum.na);
            }
            if (!searchCo.IsFromSzervezet)
            {
                result = result.Where(x => !x.Nev.Equals(TantargyResource.DualisKepzes, StringComparison.OrdinalIgnoreCase));
            }
            if (!searchCo.IsSzakkepzo)
            {
                result = result.Where(x => !x.Nev.Equals(TantargyResource.ApaczaiKonzultacio, StringComparison.OrdinalIgnoreCase));
            }

            return result.ToList();
        }

        public (bool isOsztalyzattalErtekelheto, bool isSzovegesenErtekelheto, bool isSzazalekosanErtekelheto) GetErtekelesKorlatozasok(int tantargyId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.Tantargy();
                return dal.GetErtekelesKorlatozasok(tantargyId);
            });
        }

        public int? GetDualisKepzesTantargyId()
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                return h.Tantargy().GetDualisKepzesTantargyId(IntezmenyId, TanevId);
            });
        }
    }
}