using System;
using System.Collections.Generic;
using System.Web.Mvc;
using Kreta.BusinessLogic.Classes;
using Kreta.BusinessLogic.HelperClasses;
using Kreta.BusinessLogic.Helpers;
using Kreta.Enums;
using Kreta.Enums.ManualEnums;
using Kreta.KretaServer.SystemSettings;
using Kreta.Resources;
using Kreta.Web.Areas.Intezmeny.Logic;
using Kreta.Web.Areas.Orarend.ApiControllers;
using Kreta.Web.Areas.Orarend.Logic;
using Kreta.Web.Areas.Orarend.Models;
using Kreta.Web.Helpers;
using Kreta.Web.Helpers.TabStrip;
using Kreta.Web.Models.EditorTemplates;
using Kreta.Web.Security;

namespace Kreta.Web.Areas.Orarend.Controllers
{
    public class BaseAdminTanariOrarendController : Controller
    {
        [NonAction]
        public ActionResult GetOrarendiOrak(int index = 0, bool isFromSzervezet = false)
        {
            var model = new OrarendiOrakModel
            {
                Index = index,
                IsFromSzervezet = isFromSzervezet
            };

            return View("OrarendiOrak_Tab", model);
        }

        [NonAction]
        public ActionResult GetTanoranKivuliFoglalkozasok(int index = 1, bool isFromSzervezet = false)
        {
            var model = new TanariOrarendTanoranKivuliFoglalkozasokModel()
            {
                Index = index,
                IsFromSzervezet = isFromSzervezet
            };

            return View("TanoranKivuliFoglalkozasok_Tab", model);
        }

        [NonAction]
        public ActionResult OpenNewOrarendiOraPopUp(CalendarModel model, bool isFromSzervezet = false)
        {
            var oom = GetNewOrarendiOraModel(model, false, isFromSzervezet: isFromSzervezet);

            var list = new List<TabStripItemModel>();
            list.Add(new TabStripItemModel() { ItemId = "1", ItemName = OrarendResource.TanoraAdatai, Model = oom, PartialViewName = "TanoraAdatok_Bevitel_Tanari", IsActive = true });
            if (!isFromSzervezet)
            {
                list.Add(new TabStripItemModel() { ItemId = "2", ItemName = TantargyResource.TabSpecialisAdatok, Model = oom, PartialViewName = "SpecialisAdatok_Bevitel" });
            }
            oom.OrarendiOraTabList = list;

            var tanevrendHelper = new TanevrendHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            var isDateHasTanevrend = tanevrendHelper.HasTanevRendjeEsemeny(model.Start.Date, null);

            var pm = new PopUpModel(oom, "OrarendiOra_Bevitel");
            pm = pm.AddBtn(pm, "newOrarendiOraCancel", AdminisztracioResource.Megsem, "OrarendiOrak.newOrarendiOraCancel");
            pm = pm.AddBtn(pm, "EgyOraHozzaadasaSave", OrarendResource.AddOneDay, "OrarendiOrak.EgyOraHozzaadasaSave");
            if (isFromSzervezet || !isDateHasTanevrend)
            {
                pm = pm.AddBtn(pm, "OrarendhezSave", OrarendResource.AddAllDay, "OrarendiOrak.OrarendhezSave");
            }
            if (!isDateHasTanevrend && !isFromSzervezet)
            {
                pm = pm.AddBtn(pm, "EttolHettolSave", OrarendResource.AddFrom, "OrarendiOrak.EttolHettolSave");
                pm = pm.AddBtn(pm, "EddigHetigSave", OrarendResource.AddTo, "OrarendiOrak.EddigHetigSave");
            }

            return PartialView(Constants.General.PopupView, pm);
        }

        [NonAction]
        public ActionResult OpenModifyOrarendiOraPopUp(CalendarModel model, bool isFromSzervezet = false)
        {
            var oom = GetModifyOrarendiOraModel(model, false, isFromSzervezet: isFromSzervezet);
            var isEgyOra = false;
            if (oom.OraErvenyessegKezdete.Value.Date == oom.OraErvenyessegVege.Value.Date)
                isEgyOra = true;
            var tanevrendHelper = new TanevrendHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            var isDateHasTanevrend = tanevrendHelper.HasTanevRendjeEsemeny(model.Start.Date, null);

            var pm = new PopUpModel(oom, "OrarendiOra_Mod_Bevitel");
            pm = pm.AddBtn(pm, "modCancel", AdminisztracioResource.Megsem, "OrarendiOrak.modCancel");

            pm = pm.AddBtn(pm, "tovabbiOrarendiOraFelvetele", OrarendResource.AddAgain, "OrarendiOrak.tovabbiOrarendiOraFelvetele");

            if (!isDateHasTanevrend)
            {
                pm = pm.AddBtn(pm, "modOrarendiOraDeleteDay", OrarendResource.DeleteOneDay, "OrarendiOrak.modOrarendiOraDeleteDayConfirmWindow", "pull-left");
                if (!isFromSzervezet)
                {
                    pm = pm.AddBtn(pm, "modOrarendiOraDeleteFrom", OrarendResource.DeleteFrom, "OrarendiOrak.modOrarendiOraDeleteFromConfirmWindow", "pull-left");
                    pm = pm.AddBtn(pm, "modOrarendiOraDeleteTo", OrarendResource.DeleteTo, "OrarendiOrak.modOrarendiOraDeleteToConfirmWindow", "pull-left");
                }

                pm = pm.AddBtn(pm, "modOrarendiOraDelete", OrarendResource.DeleteAll, "OrarendiOrak.modOrarendiOraDeleteConfirmWindow", "pull-left");
                pm = pm.AddBtn(pm, "modOrarendiOraSaveDay", OrarendResource.ModSaveOneDay, "OrarendiOrak.modOrarendiOraSaveDay", secondLine: true, "pull-left");
                if (!isFromSzervezet)
                {
                    pm = pm.AddBtn(pm, "modOrarendiOraSaveFrom", OrarendResource.ModSaveFrom, "OrarendiOrak.modOrarendiOraSaveFrom", secondLine: true, "pull-left");
                    pm = pm.AddBtn(pm, "modOrarendiOraSaveTo", OrarendResource.ModSaveTo, "OrarendiOrak.modOrarendiOraSaveTo", secondLine: true, "pull-left");
                }

                pm = pm.AddBtn(pm, "modOrarendiOraSave", OrarendResource.ModAllSave, "OrarendiOrak.modOrarendiOraSaveTanev", secondLine: true, "pull-left");
            }
            else
            {
                //Bármikor lehessen egy órát törölni
                pm = pm.AddBtn(pm, "modOrarendiOraDeleteDay", OrarendResource.DeleteOneDay, "OrarendiOrak.modOrarendiOraDeleteDayConfirmWindow", "pull-left");
                if (isEgyOra)
                {
                    pm = pm.AddBtn(pm, "modOrarendiOraSaveDay", OrarendResource.ModSaveOneDay, "OrarendiOrak.modOrarendiOraSaveDay", "pull-left");
                }
            }

            return PartialView(Constants.General.PopupView, pm);
        }

        [NonAction]
        public ActionResult OpenNewFoglalkozasokOraPopUp(CalendarModel model, bool isFromSzervezet = false)
        {
            var oom = GetNewOrarendiOraModel(model, true, isFromSzervezet);

            var list = new List<TabStripItemModel>();
            list.Add(new TabStripItemModel() { ItemId = "1", ItemName = OrarendResource.TanoraAdatai, Model = oom, PartialViewName = "TanoraAdatok_Bevitel_Tanari", IsActive = true });
            if (!isFromSzervezet)
            {
                list.Add(new TabStripItemModel() { ItemId = "2", ItemName = TantargyResource.TabSpecialisAdatok, Model = oom, PartialViewName = "SpecialisAdatok_Bevitel" });
            }

            oom.OrarendiOraTabList = list;

            var helper = new TanevrendHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            var isDateHasTanevrend = helper.HasTanevRendjeEsemeny(model.Start.Date, null);

            var pm = new PopUpModel(oom, "OrarendiOra_Bevitel");
            pm = pm.AddBtn(pm, "newOrarendiOraCancel", AdminisztracioResource.Megsem, "Foglalkozasok.newFoglalkozasCancel");
            pm = pm.AddBtn(pm, "EgyOraHozzaadasaSave", OrarendResource.AddOneDay, "Foglalkozasok.EgyOraHozzaadasaSave");

            if (!isDateHasTanevrend && !isFromSzervezet)
            {
                pm = pm.AddBtn(pm, "EttolHettolSave", OrarendResource.AddFrom, "Foglalkozasok.EttolHettolSave");
                pm = pm.AddBtn(pm, "EddigHetigSave", OrarendResource.AddTo, "Foglalkozasok.EddigHetigSave");
            }
            if (isFromSzervezet || !isDateHasTanevrend)
            {
                pm = pm.AddBtn(pm, "OrarendhezSave", OrarendResource.AddAllDay, "Foglalkozasok.OrarendhezSave");
            }

            return PartialView(Constants.General.PopupView, pm);
        }

        [NonAction]
        public ActionResult OpenModifyFoglalkozasokOraPopUp(CalendarModel model, bool isFromSzervezet = false)
        {
            var oom = GetModifyOrarendiOraModel(model, true, isFromSzervezet: isFromSzervezet);

            var tanevrendHelper = new TanevrendHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            var isDateHasTanevrend = tanevrendHelper.HasTanevRendjeEsemeny(model.Start.Date, null);

            var pm = new PopUpModel(oom, "OrarendiOra_Mod_Bevitel");
            pm = pm.AddBtn(pm, "modFoglalkozasCancel", AdminisztracioResource.Megsem, "Foglalkozasok.modFoglalkozasCancel");

            if (model.HelyettesitoId == null)
            {
                pm = pm.AddBtn(pm, "tovabbiFoglalkozasFelvetele", OrarendResource.AddAgain, "Foglalkozasok.tovabbiFoglalkozasFelvetele");

                if (!isDateHasTanevrend)
                {
                    pm = pm.AddBtn(pm, "modFoglalkozasDeleteDay", OrarendResource.DeleteOneDay, "Foglalkozasok.modFoglalkozasDeleteDayConfirmWindow", "pull-left");
                    if (!isFromSzervezet)
                    {
                        pm = pm.AddBtn(pm, "modFoglalkozasDeleteFrom", OrarendResource.DeleteFrom, "Foglalkozasok.modFoglalkozasDeleteFromConfirmWindow", "pull-left");
                        pm = pm.AddBtn(pm, "modFoglalkozasDeleteTo", OrarendResource.DeleteTo, "Foglalkozasok.modFoglalkozasDeleteToConfirmWindow", "pull-left");
                    }

                    pm = pm.AddBtn(pm, "modFoglalkozasDelete", OrarendResource.DeleteAll, "Foglalkozasok.modFoglalkozasDeleteConfirmWindow", "pull-left");

                    pm = pm.AddBtn(pm, "modFoglalkozasSaveDay", OrarendResource.ModSaveOneDay, "Foglalkozasok.modFoglalkozasSaveDay", secondLine: true, "pull-left");
                    if (!isFromSzervezet)
                    {
                        pm = pm.AddBtn(pm, "modFoglalkozasSaveFrom", OrarendResource.ModSaveFrom, "Foglalkozasok.modFoglalkozasSaveFrom", secondLine: true, "pull-left");
                        pm = pm.AddBtn(pm, "modFoglalkozasSaveTo", OrarendResource.ModSaveTo, "Foglalkozasok.modFoglalkozasSaveTo", secondLine: true, "pull-left");
                    }

                    pm = pm.AddBtn(pm, "modFoglalkozasSave", OrarendResource.ModAllSave, "Foglalkozasok.modFoglalkozasSaveTanev", secondLine: true, "pull-left");
                }
                else
                {
                    pm = pm.AddBtn(pm, "modFoglalkozasDeleteDay", OrarendResource.DeleteOneDay, "Foglalkozasok.modFoglalkozasDeleteDayConfirmWindow", "pull-left");
                }
            }

            return PartialView(Constants.General.PopupView, pm);
        }

        private OrarendiOraModel GetNewOrarendiOraModel(CalendarModel model, bool isTanoranKivuliFoglalkozas, bool isFromSzervezet = false)
        {
            var oom = new OrarendiOraModel
            {
                IsTanoranKivuliFoglalkozas = isTanoranKivuliFoglalkozas,
                OraKezdete = model.Start.ToLocalTime(),
                OraVege = model.End.ToLocalTime(),
                Sorszamozando = true,
                ErvenyessegiIdoSzoveg = string.Format(SDAFormat.Format[SDAFormat.FormatType.ShortDate], model.Start.ToLocalTime()),
                ErvenyessegiIdo = model.Start.ToLocalTime(),
                OraErvenyessegKezdete = model.Start,
                ValasztottDatum = model.Start,
                OraErvenyessegVege = !isFromSzervezet ? model.End : (DateTime?)null,
                CsengetesiRendOraID = model.EventId,
                HetirendID = (int)HetiRendTipusEnum.MindegyikHet,
                Hetirend = HetiRendTipusEnum.MindegyikHet.GetDisplayName(ClaimData.SelectedTanevID.Value)
            };

            if (!isTanoranKivuliFoglalkozas)
            {
                OrarendiOraLogic.SetCsengetesiRendAndOraszam(oom);
            }

            oom.OrarendiElemekRogzitesenekElofeltetele = SystemSettingsManager.GetSystemSettingValue<int>(RendszerBeallitasTipusEnum.orarendi_elemek_rogzitesenek_elofeltetele, ClaimData.IntezmenyAzonosito, ClaimData.SelectedTanevID.Value);

            OrarendiOraLogic.SetHetNapja(oom, oom.ErvenyessegiIdo.DayOfWeek);
            oom.HetirendList = OrarendiOraLogic.GetAktualHetirendList();
            oom.IsEgyediNap = isFromSzervezet ? TanevRendjeLogic.IsEgyediNapByDate(model.Start.Date) : !isFromSzervezet;
            oom.IsFromSzervezet = isFromSzervezet;

            return oom;
        }

        private OrarendiOraModel GetModifyOrarendiOraModel(CalendarModel model, bool isTanoranKivuliFoglalkozas, bool isFromSzervezet = false)
        {
            OrarendiOraCO ooco;
            TantargyFelosztasCO tfco;
            int tanarId;

            var orarendiOraHelper = new OrarendiOraHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            orarendiOraHelper.GridParameters = null;
            ooco = orarendiOraHelper.GetOrarendiOraById(model.EventId);
            tanarId = orarendiOraHelper.GetTanarIdByOrarendiOra(model.EventId);

            tfco = new TantargyFelosztasCO
            {
                OsztalyCsoportID = ooco.OsztalyCsoportId.Value,
                TantargyID = ooco.TantargyId.Value
            };

            var oom = ConvertCoToModel(ooco, tanarId, tfco);
            oom.IsTanoranKivuliFoglalkozas = isTanoranKivuliFoglalkozas;
            oom.IsModification = true;
            oom.ModificationDate = model.Start;
            oom.ErvenyessegiIdoSzoveg = string.Format(SDAFormat.Format[SDAFormat.FormatType.ShortDateAndTime], oom.OraErvenyessegKezdete.Value);
            oom.OrarendiOraTabList = OrarendiOraLogic.GetModOrarendiOraTabs(oom, AdminOrarendTipusEnum.Tanari.ToString(), isFromSzervezet);
            oom.OraKezdete = ooco.OraKezdete;
            oom.OraVege = ooco.OraVege;
            oom.ErvenyessegiIdo = model.Start;

            var api = new AdminTanariOrarendApiController();
            oom.HetirendList = api.GetHetirendList();
            oom.IsEgyediNap = isFromSzervezet ? TanevRendjeLogic.IsEgyediNapByDate(model.Start.Date) : !isFromSzervezet;
            oom.IsFromSzervezet = isFromSzervezet;

            oom.OrarendiElemekRogzitesenekElofeltetele = SystemSettingsManager.GetSystemSettingValue<int>(RendszerBeallitasTipusEnum.orarendi_elemek_rogzitesenek_elofeltetele, ClaimData.IntezmenyAzonosito, ClaimData.SelectedTanevID.Value);

            return oom;
        }

        private OrarendiOraModel ConvertCoToModel(OrarendiOraCO ooco, int tanarId, TantargyFelosztasCO tfco)
        {
            var model = new OrarendiOraModel
            {
                ID = ooco.ID,
                CsengetesiRendOraID = ooco.CsengetesiRendOraID,
                CsengetesiRendID = ooco.CsengetesiRendID,
                HetirendID = ooco.Hetirend,
                Hetirend = ooco.Hetirend > 0 ? ooco.Hetirend.GetDisplayName<HetiRendTipusEnum>(ClaimData.SelectedTanevID.Value) : string.Empty,
                TeremID = ooco.TeremID,
                OraErvenyessegKezdete = ooco.OraErvenyessegKezdete,
                OraErvenyessegVege = ooco.OraErvenyessegVege,
                Oraszam = ooco.Oraszam,

                Bontott = ooco.Bontott,
                Differencialt = ooco.Differencialt,
                Drama = ooco.Drama,
                HetNapja = ooco.HetNapja,
                IKTTanora = ooco.IKTTanora,
                IPRTanora = ooco.IPRTanora,
                Kooperativ = ooco.Kooperativ,
                Meres = ooco.Meres,
                MindennaposTestneveles = ooco.MindennaposTestneveles,
                NemSzakrendszeruOra = ooco.NemSzakrendszeruOra,
                NemzetisegiOra = ooco.NemzetisegiOra,
                IsFelnottoktatasiSzerzodes = ooco.IsFelnottoktatasiSzerzodes,
                OnlineOra = ooco.OnlineOra,
                ParhuzamosOra = ooco.ParhuzamosOra,
                Sorszamozando = ooco.Sorszamozando,
                TAMOPOra = ooco.TAMOPOra,
                KIPOra = ooco.KIPOra,
                VEKOP73317 = ooco.VEKOP73317,
                KAPOra = ooco.KAPOra,
                Tiop = ooco.Tiop,
                Tulora = ooco.Tulora,
                IsModification = ooco.IsModification,
                Multikulturalis = ooco.Multikulturalis,
                EFOP32317 = ooco.EFOP32317,
                KomplexOra = ooco.KomplexOra,
                GINOP623 = ooco.GINOP623,
                EFOP31716EselyteremtesAKoznevelesben = ooco.EFOP31716EselyteremtesAKoznevelesben,
                EFOP33717 = ooco.EFOP33717,
                TIOP11112120120001 = ooco.TIOP11112120120001,
                DFHT = ooco.DFHT,
                Rahangolodas = ooco.Rahangolodas,
                Testmozgas = ooco.Testmozgas,
                Muveszet = ooco.Muveszet,
                Eletgyakorlat = ooco.Eletgyakorlat,
                Logika = ooco.Logika,
                TeOrad = ooco.TeOrad,
                DigitalisAlapProgram = ooco.DigitalisAlapProgram,
                HetNapjaSzoveg = ooco.HetNapja.GetDisplayName<HetNapjaTipusEnum>(ClaimData.SelectedTanevID.Value),
                EFOP23517201700038Miapalya = ooco.EFOP23517201700038Miapalya,
                TanevTananyaganakIsmetlese = ooco.TanevTananyaganakIsmetlese,
                TanevTananyaganakKiegeszitese = ooco.TanevTananyaganakKiegeszitese,
                TanulokDigitalisKeszsegfejlesztese = ooco.TanulokDigitalisKeszsegfejlesztese,
                Projektmunka = ooco.Projektmunka,
                TanulokKompenzaciosIraskeszsegFejlesztese = ooco.TanulokKompenzaciosIraskeszsegFejlesztese,
                TanulokKompenzaciosOlvasasiKepessegFejlesztese = ooco.TanulokKompenzaciosOlvasasiKepessegFejlesztese,
                TanulokMatematikaiGondolkodasiKepessegenekKompenzaciosFejlesztese = ooco.TanulokMatematikaiGondolkodasiKepessegenekKompenzaciosFejlesztese,
                TanulokNyelviKepessegenekKompenzaciosFejlesztese = ooco.TanulokNyelviKepessegenekKompenzaciosFejlesztese,
                TanulokOnmegismeresenekSegitese = ooco.TanulokOnmegismeresenekSegitese,
                TanulokOnallosagraNevelese = ooco.TanulokOnallosagraNevelese,
                TanulokTanulasszervezesiKompenzaciosTechnikajanakErositese = ooco.TanulokTanulasszervezesiKompenzaciosTechnikajanakErositese,
                TanulokOrientaciosTamogatasa = ooco.TanulokOrientaciosTamogatasa,
                TanulokSzocialitasanakFejlesztese = ooco.TanulokSzocialitasanakFejlesztese,
                TanulokTovabbhaladasatElokeszitoTevekenysegek = ooco.TanulokTovabbhaladasatElokeszitoTevekenysegek,
                PedagogusAltalJelzettEgyeniEsetkezeles = ooco.PedagogusAltalJelzettEgyeniEsetkezeles,
                ProjektmunkaTamogatasa = ooco.ProjektmunkaTamogatasa,
                DigitalisKeszsegfejlesztes = ooco.DigitalisKeszsegfejlesztes,
                KozossegiMunkaTamogatasa = ooco.KozossegiMunkaTamogatasa,
                TanoraElokeszitesenekTamogatasa = ooco.TanoraElokeszitesenekTamogatasa,
                TanoraLebonyolitasanakTamogatasa = ooco.TanoraLebonyolitasanakTamogatasa,
                NapkozisTevekenysegKeretebenEgyeniFejlesztes = ooco.NapkozisTevekenysegKeretebenEgyeniFejlesztes,
                IsEgybefuggoGyakorlat = ooco.IsEgybefuggoGyakorlat,

                TTFModel = new TTFModel
                {
                    FoglalkozasID = ooco.FoglalkozasID,
                    TanarID = tanarId,
                    Oraszam = (int)tfco.Oraszam,
                    OsztalyID = tfco.OsztalyCsoportID,
                    TantargyID = tfco.TantargyID,
                    Nev = !string.IsNullOrWhiteSpace(tfco.Nev) ? tfco.Nev : string.Empty
                },
            };

            return model;
        }

        public string GetOrarendiOraWindowTitle(CalendarModel model, bool isFromSzervezet = false)
        {
            var oom = new OrarendiOraModel
            {
                ErvenyessegiIdoSzoveg = string.Format(SDAFormat.Format[SDAFormat.FormatType.ShortDate], model.Start)
            };

            OrarendiOraLogic.SetHetNapja(oom, model.Start.ToLocalTime().DayOfWeek);

            var api = new AdminTanariOrarendApiController();
            int oraszam = api.GetOraszam(model.EventId, model.OraType);

            return string.Format(" [{0} - {1}: {2}. óra]", oom.ErvenyessegiIdoSzoveg, oom.HetNapjaSzoveg, oraszam);
        }

        public string GetFoglalkozasWindowTitle(CalendarModel model, bool isFromSzervezet = false)
        {
            var oom = new OrarendiOraModel
            {
                ErvenyessegiIdoSzoveg = string.Format(SDAFormat.Format[SDAFormat.FormatType.ShortDate], model.Start)
            };

            OrarendiOraLogic.SetHetNapja(oom, model.Start.ToLocalTime().DayOfWeek);

            //var api = new AdminTanariOrarendApiController();
            //int oraszam = api.GetOraszam(model.EventId, model.OraType);

            return string.Format(" [{0} - {1}]", oom.ErvenyessegiIdoSzoveg, oom.HetNapjaSzoveg);
        }
    }
}