using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Mime;
using System.Text;
using System.Web;
using System.Web.Mvc;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Interfaces;
using Kreta.BusinessLogic.Security;
using Kreta.Core;
using Kreta.Core.Iktato.Poszeidon.Factory.Interface;
using Kreta.Enums;
using Kreta.Enums.ManualEnums;
using Kreta.Framework;
using Kreta.Resources;
using Kreta.Web.Areas.Intezmeny.ApiControllers;
using Kreta.Web.Areas.Intezmeny.Models;
using Kreta.Web.Controllers;
using Kreta.Web.Helpers;
using Kreta.Web.Helpers.Error;
using Kreta.Web.Helpers.TabStrip;
using Kreta.Web.ModelBinder.Mvc;
using Kreta.Web.Models;
using Kreta.Web.Models.EditorTemplates;
using Kreta.Web.Security;

namespace Kreta.Web.Areas.Intezmeny.Controllers
{
    [MvcRoleClaimsAuthorize(true)]
    [MvcRolePackageDenyAuthorize(KretaClaimPackages.IsOnlyAlkalmozott.ClaimValue)]
    [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue)]
    public class IntezmenyController : Controller
    {
        private IIktatoRepositoryFactory IktatoRepositoryFactory { get; }
        private IktatoServiceConfiguration IktatoServiceConfiguration { get; }
        private readonly IJiraHelper JiraHelper;

        public IntezmenyController(IJiraHelper jiraHelper, IIktatoRepositoryFactory iktatoRepositoryFactory, IktatoServiceConfiguration iktatoServiceConfiguration)
        {
            IktatoRepositoryFactory = iktatoRepositoryFactory;
            IktatoServiceConfiguration = iktatoServiceConfiguration;
            JiraHelper = jiraHelper;
        }

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue)]
        [MvcRolePackageDenyAuthorize(TanevEnum.Mind, KretaClaimPackages.IsOnlyAlkalmozott.ClaimValue)]
        public ActionResult Index()
        {
            IntezmenyApiController api = new IntezmenyApiController(JiraHelper);
            IntezmenyModel model = api.GetIntezmeny(IktatoRepositoryFactory, IktatoServiceConfiguration);
            return View("Index", model);
        }

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.Ellenorzo.ClaimValue)]
        public ActionResult IntezmenyFeladatEllatasiHelyDetailGrid(int? id)
        {
            return PartialView("IntezmenyFeladatEllatasiHelyDetailGrid", id);
        }

        public ActionResult ModIntezmenyPopUp()
        {
            IntezmenyApiController api = new IntezmenyApiController(JiraHelper);
            IntezmenyModel model = api.GetIntezmeny(IktatoRepositoryFactory, IktatoServiceConfiguration);
            model.FormSettings = new List<string>() {
                CimElerhetosegConstant.CimSectionVisible,
                CimElerhetosegConstant.TartozkodasiHelyCimTipus,
                CimElerhetosegConstant.SeparatorRowHide,
                CimElerhetosegConstant.CsakMagyarorszag
            };
            model.TanulovalEgyezik = false;
            PopUpModel pm = new PopUpModel(model, "Intezmeny_Bevitel");
            pm = pm.AddCancelBtn(pm, "IntezmenyHelper.modIntezmenyPopUpCancel");
            pm = pm.AddOkBtn(pm, "IntezmenyHelper.modIntezmenyPopUpSave");

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

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue)]
        public ActionResult GetIntezmenyAdatokPartial()
        {
            IntezmenyApiController api = new IntezmenyApiController(JiraHelper);
            IntezmenyInfoModel intezmenyInfoModel = new IntezmenyInfoModel(api.GetIntezmeny(IktatoRepositoryFactory, IktatoServiceConfiguration));

            return PartialView("Intezmeny_AdatokInfo_Partial", intezmenyInfoModel.info);
        }

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.Ellenorzo.ClaimValue)]
        public ActionResult InfoMukodesiHelyPopUp(int pID)
        {
            IntezmenyApiController api = new IntezmenyApiController(JiraHelper);
            MukodesiHelyModel model = api.GetMukodesiHely(pID);

            PopUpModel pm = new PopUpModel(model, "MukodesiHely_Info");
            pm = pm.AddCancelBtn(pm, "IntezmenyHelper.infoMukodesiHelyPopUpCancel");

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

        public ActionResult ModMukodesiHelyPopUp(int? pID)
        {

            IntezmenyApiController api = new IntezmenyApiController(JiraHelper);
            MukodesiHelyModel model = pID.HasValue ? api.GetMukodesiHely(pID.Value) : new MukodesiHelyModel();
            model.FormSettings = new List<string>() {
                CimElerhetosegConstant.CimSectionVisible,
                CimElerhetosegConstant.TartozkodasiHelyCimTipus,
                CimElerhetosegConstant.SeparatorRowHide,
                CimElerhetosegConstant.CsakMagyarorszag
            };
            model.TanulovalEgyezik = false;
            model.Orszag = (int)OrszagTipusEnum.Magyarorszag;

            PopUpModel pm = new PopUpModel(model, "MukodesiHely_Bevitel");
            pm = pm.AddCancelBtn(pm, "IntezmenyHelper.modMukodesiHelyPopUpCancel");
            pm = pm.AddOkBtn(pm, "IntezmenyHelper.modMukodesiHelyPopUpSave");

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

        public ActionResult ModFeladatPopUp(FeladatellatasiHelyModel panelFeladatellatasiHelyModel)
        {
            IntezmenyApiController api = new IntezmenyApiController(JiraHelper);

            if (panelFeladatellatasiHelyModel.ID.HasValue)
            {
                panelFeladatellatasiHelyModel = api.GetFeladatellatasiHely(panelFeladatellatasiHelyModel.ID.Value);
            }

            panelFeladatellatasiHelyModel.FeladatList = new ComboBoxHelperApiController().GetOktatasiNevelesiFeladatList(false);

            SelectListItem aktItem = new SelectListItem();
            if (panelFeladatellatasiHelyModel.FeladatTipus.HasValue)
            {
                aktItem = panelFeladatellatasiHelyModel.FeladatList.Where(x => x.Value == panelFeladatellatasiHelyModel.FeladatTipus.Value.ToString()).FirstOrDefault();
            }

            // "Működés helyhez egy típusból csak egyet lehessen felvenni, ne duplikálódjon"
            panelFeladatellatasiHelyModel.FeladatList = api.GetFeladatListByMukodesiHelyId(panelFeladatellatasiHelyModel.MukodesiHelyID);

            if (!string.IsNullOrWhiteSpace(aktItem.Value) && !string.IsNullOrWhiteSpace(aktItem.Text))
            {
                panelFeladatellatasiHelyModel.FeladatList.Add(aktItem);
            }

            var oktatasNevelesiFeladatHelper = new OktatasNevelesiFeladatHelper(ConnectionTypeExtensions.GetSessionConnectionType());
            panelFeladatellatasiHelyModel.IsAMIModuleActive = oktatasNevelesiFeladatHelper.IsAMIModuleActive();
            panelFeladatellatasiHelyModel.IsKollegiumModuleActive = oktatasNevelesiFeladatHelper.IsKollegiumModuleActive();
            panelFeladatellatasiHelyModel.IsEGYMIModuleActive = oktatasNevelesiFeladatHelper.IsEGYMIModuleActive();

            PopUpModel pm = new PopUpModel(panelFeladatellatasiHelyModel, "FeladatellatasiHely_Bevitel");
            pm = pm.AddCancelBtn(pm, "IntezmenyHelper.modFeladatPopUpCancel");
            pm = pm.AddOkBtn(pm, "IntezmenyHelper.modFeladatPopUpSave");

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

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue)]
        public ActionResult OpenFeladatellatasiHelyTab(int feladellHelyID)
        {
            FeladatellatasiHelyModel fmodel = new FeladatellatasiHelyModel()
            {
                ID = feladellHelyID
            };

            fmodel.TabList = GetTabItems(fmodel);
            PopUpModel pm = new PopUpModel(fmodel, "FeladatellatasiHelyAdatokTab");
            pm.AddCancelBtn(pm, "IntezmenyHelper.cancelFeladatellatasiHelyAdatok");

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

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue)]
        public ActionResult OpenFeladatellatasiHely_AlapadatokTab(int id)
        {
            IntezmenyApiController api = new IntezmenyApiController(JiraHelper);
            FeladatellatasiHelyModel fmodel = api.GetFeladatellatasiHelyAlapadatok(id);

            return PartialView("FeladatellatasiHely_AlapadatokTab", fmodel);
        }

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue)]
        public ActionResult OpenFeladatellatasiHely_OsztalycsoportokTab(int id)
        {
            FeladatellatasiHelyModel fmodel = new FeladatellatasiHelyModel()
            {
                ID = id
            };

            return PartialView("FeladatellatasiHely_OsztalyokTab", fmodel);
        }

        [MvcRolePackageAuthorize(TanevEnum.Mind, KretaClaimPackages.Adminisztrator.ClaimValue)]
        public ActionResult OpenFeladatellatasiHely_AlkalmazottakTab(int id)
        {
            FeladatellatasiHelyModel fmodel = new FeladatellatasiHelyModel()
            {
                ID = id
            };

            return PartialView("FeladatellatasiHely_AlkalmazottakTab", fmodel);
        }

        public ActionResult IntezmenyiDokumentumPartial(IntezmenyiDokumentumModel model)
        {
            IntezmenyApiController api = new IntezmenyApiController(JiraHelper);
            var filledModel = api.GetIntezmenyiDokumentumModel(model.Tipus, IktatoRepositoryFactory, IktatoServiceConfiguration);
            return PartialView("Intezmeny_Dokumentum_Partial", filledModel);
        }

        public List<TabStripItemModel> GetTabItems(FeladatellatasiHelyModel model)
        {
            var items = new List<TabStripItemModel>();
            items.Add(new TabStripItemModel { ItemId = "1", ItemName = StringResourcesUtil.GetString(161) /*Alapadatok*/, Area = "Intezmeny", Controller = "Intezmeny", Action = "openFeladatellatasiHely_AlapadatokTab", RouteParameters = new Dictionary<string, string> { { "Id", model.ID.ToString() } } });
            items.Add(new TabStripItemModel { ItemId = "2", ItemName = StringResourcesUtil.GetString(3858) /*Kapcsolódó osztályok/csoportok*/, Area = "Intezmeny", Controller = "Intezmeny", Action = "openFeladatellatasiHely_OsztalycsoportokTab", RouteParameters = new Dictionary<string, string> { { "Id", model.ID.ToString() } } });
            items.Add(new TabStripItemModel { ItemId = "3", ItemName = StringResourcesUtil.GetString(3859) /*Kapcsolódó alkalmazottak*/, Area = "Intezmeny", Controller = "Intezmeny", Action = "openFeladatellatasiHely_AlkalmazottakTab", RouteParameters = new Dictionary<string, string> { { "Id", model.ID.ToString() } } });
            return items;
        }

        #region Export
        public ActionResult ExportMukodesiHelyekAdatai()
        {
            var bytes = new FeladatEllatasiHelyHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetMukodesiHelyekAdataiExcelExport();

            return new FileContentResult(bytes, MediaTypeNames.Application.Octet)
            {
                FileDownloadName = HttpUtility.UrlEncode(IntezmenyResource.MukodesiHelyekAdataiExportFileName, Encoding.UTF8),
            };
        }
        #endregion

        [HttpPost]
        public ActionResult UploadFile([ModelBinder(typeof(AlapdokumentumFileUploadBinder))] IEnumerable<System.Web.HttpPostedFileBase> files, string dokumentumTipus)
        {
            var helper = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            helper.InsertDokumentum(IktatoRepositoryFactory, IktatoServiceConfiguration, files, (Enums.DokumentumTipusEnum)System.Enum.Parse(typeof(Enums.DokumentumTipusEnum), dokumentumTipus));

            return Content("");
        }

        public ActionResult DownloadFile(string id)
        {
            try
            {
                var phelper = new PoszeidonHelper(ConnectionTypeExtensions.GetSessionConnectionType(), IktatoRepositoryFactory, IktatoServiceConfiguration);

                var (fajlnev, tartalom) = phelper.Lekeres(id.ToString());

                return new FileContentResult(tartalom, MediaTypeNames.Application.Octet)
                {
                    FileDownloadName = HttpUtility.UrlEncode(fajlnev, Encoding.UTF8),
                };
            }
            catch (Exception ex)
            {
                throw new StatusError(HttpStatusCode.NotFound, ex.Message, ex);
            }
        }
    }
}