using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using Kreta.BusinessLogic.Classes;
using Kreta.BusinessLogic.HelperClasses;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Security;
using Kreta.Core.ConnectionType;
using Kreta.Enums;
using Kreta.Web.Security;
using Kreta.Web.Utils;
using Newtonsoft.Json;

namespace Kreta.Web.Helpers
{
    public static class CommonExtensions
    {
        public static List<SelectListItem> ToSelectListItemList(this IDictionary<string, string> dictionary, List<string> removeValueList = null, int? selectedValue = null)
        {
            var itemList = removeValueList != null
                ? dictionary.Where(x => !removeValueList.Contains(x.Key))
                : dictionary;

            var result = itemList.Select(x => new SelectListItem
            {
                Value = x.Key,
                Text = x.Value,
                Selected = selectedValue != null && x.Key == selectedValue.ToString()
            }).ToList();

            return result;
        }

        public static string ToJson(this object obj, bool isNeedEncoding = false)
        {
            var json = JsonConvert.SerializeObject(obj);
            if (!isNeedEncoding)
            {
                return json;
            }
            return System.Web.HttpUtility.JavaScriptStringEncode(json);
        }

        public static string ToJsonReplaceSpecialCharaters(this string text)
        {
            string result = text
                .Replace("'", @"\'")
                .Replace("\"", "&quot;");
            return result;
        }

        #region Nyomtatványhoz név és azonosító generálás

        public static string NevGeneralas(string nyomtatvanynev, NyomtatvanyNevGeneralasModel model, bool isIktatas = false, bool notAppendDateTimeNow = false, string customMessage = null, bool forOrganization = false)
        {
            IConnectionType connectionType = ConnectionTypeExtensions.GetOrganizationConnectionType();

            if (!forOrganization)
            {
                connectionType = ConnectionTypeExtensions.GetSessionConnectionType();
            }

            var result = new StringBuilder(nyomtatvanynev + "_");
            if (model.TanuloID.HasValue)
            {
                var h = new TanuloHelper(connectionType);

                var tanulo = h.GetTanuloiAdatok(model.TanuloID.Value, ClaimData.KovTanevID, ClaimData.IsSelectedTanev20_21OrLater, ClaimData.IsSelectedTanev21_22OrLater);
                result.Append(tanulo.CsaladiNev + "_" + tanulo.UtoNev + "_" + tanulo.OktatasiAzonosito + "_");
            }

            if (model.OsztalyCsoportId.HasValue)
            {
                var h = new OsztalyCsoportHelper(connectionType);
                result.Append(h.GetOsztalyCsoportNevById(model.OsztalyCsoportId.Value) + "_");
            }

            if (model.TanarID.HasValue)
            {
                var h = new TanarHelper(connectionType);
                var tanar = h.GetTanarAdatok(model.TanarID.Value);
                result.Append(tanar.MunkavallaloCsaladiNev + "_" + tanar.MunkavallaloUtonev + "_");
            }

            if (model.OsztalyID.HasValue)
            {
                var h = new OsztalyHelper(connectionType);

                var osztaly = h.GetClassById(model.OsztalyID.Value);
                result.Append(osztaly.OsztalyNev + "_");
            }

            if (model.CsoportId.HasValue)
            {
                var h = new CsoportHelper(connectionType);

                var csoport = h.GetGroupByID(model.CsoportId.Value);
                result.Append(csoport.CsoportNeve + "_");
            }

            if (model.TeremID.HasValue)
            {
                var h = new TeremHelper(connectionType);

                var teremNev = h.GetTeremNev(model.TeremID.Value);
                result.Append(teremNev + "_");
            }

            if (model.FoglalkozasID.HasValue)
            {
                var h = new FoglalkozasHelper(connectionType);

                var foglalkozasNev = h.GetFoglalkozasNeve(model.FoglalkozasID.Value);
                result.Append(foglalkozasNev + "_");
            }

            if (model.FeladatellatasiHelyId.HasValue)
            {
                var h = new FeladatEllatasiHelyHelper(connectionType);

                var feladatellatasiHelyNev = h.GetFeladatEllatasiHelyDDl(string.Empty).ToList().First(x => x.Key == model.FeladatellatasiHelyId.Value.ToString()).Value;
                result.Append(feladatellatasiHelyNev + "_");
            }

            if (model.TanevID.HasValue)
            {
                var h = new TanevHelper(new OrganizationConnectionType(connectionType.FelhasznaloId, connectionType.IntezmenyId, connectionType.IntezmenyAzonosito, model.TanevID.Value));
                var tanev = h.GetTanevInfo();
                result.Append(tanev.Nev.Replace("/", "_"));

                if (!isIktatas)
                {
                    result.Append('_');
                }
            }

            if (!isIktatas && !notAppendDateTimeNow)
            {
                result.Append(DateTime.Now.ToShortDateString());
            }

            if (!string.IsNullOrWhiteSpace(customMessage))
            {
                result.Append("_" + customMessage);
            }

            return result.ToString();
        }

        #endregion

        private const string TanarDashboardUrl = "~/Tanar/TanarDashboard";
        private const string LoginUrl = "~/Adminisztracio/Login";

        public static string GetDefaultPage(bool fromKretaLogo = false)
        {
            var role = ClaimData.FelhasznaloSzerepkor;
            var package = ClaimData.FelhasznaloSzerepCsomagok;

            if (package.Contains(KretaClaimPackages.IsArchivIntezmeny.ClaimValue))
            {
                return ApplicationData.ArchivDefaultPage;
            }

            if (role.Equals(SzerepkorTipusEnum.Ellenorzo))
            {
                if (package.Contains(KretaClaimPackages.Gondviselo.ClaimValue))
                {
                    return ApplicationData.SzuloDefaultPage;
                }

                if (package.Contains(KretaClaimPackages.CsokkentettGondviselo.ClaimValue))
                {
                    return ApplicationData.CsokkentettSzuloDefaultPage;
                }

                return ApplicationData.TanuloDefaultPage;
            }

            if (role.Equals(SzerepkorTipusEnum.Naplo))
            {
                if (!fromKretaLogo && !ProfileUtils.HetirendMegjeleniteseBelepeskor)
                {
                    return TanarDashboardUrl;
                }

                if (package.Contains(KretaClaimPackages.Osztalyfonok.ClaimValue) || package.Contains(KretaClaimPackages.SzuperOsztalyfonok.ClaimValue))
                {
                    return ApplicationData.OsztalyfonokDefaultPage;
                }

                if (package.Contains(KretaClaimPackages.Tanar.ClaimValue))
                {
                    return ApplicationData.TanarDefaultPage;
                }

                return ApplicationData.NaploDefaultPage;
            }

            if (role.Equals(SzerepkorTipusEnum.Adminisztrator))
            {
                if (package.Contains(KretaClaimPackages.SzuperOsztalyfonok.ClaimValue))
                {
                    return ApplicationData.IgazgatoDefaultPage;
                }

                return ApplicationData.AdminDefaultPage;
            }

            if (package.Contains(KretaClaimPackages.Dualis_Admin.ClaimValue))
            {
                return ApplicationData.DualisAdminDefaultPage;
            }

            if (package.Contains(KretaClaimPackages.TavolletIgenylo.ClaimValue))
            {
                return ApplicationData.TavolletDefaultPage;
            }

            return LoginUrl;
        }
    }
}