using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.ModelBinding;
using Kendo.Mvc.UI;
using Kreta.BusinessLogic.Helpers;
using Kreta.Core.Domain;
using Kreta.Core.Exceptions;
using Kreta.Core.KIR.Factory.Interface;
using Kreta.Resources;
using Kreta.Web.Areas.KirImportExport.Logic;
using Kreta.Web.Areas.KirImportExport.Models;
using Kreta.Web.Areas.KirImportExport.Models.KirImport;
using Kreta.Web.Helpers;
using Kreta.Web.Helpers.Error;
using Kreta.Web.Helpers.Grid;
using Kreta.Web.Security;
using Newtonsoft.Json;

namespace Kreta.Web.Areas.KirImportExport.ApiControllers
{
    public class KirAlkalmazottImportApiController : BaseApiController
    {
        public KirAlkalmazottImportApiController(IKirServiceFactory kirServiceFactory, IKir2ServiceFactory kir2ServiceFactory) : base(kirServiceFactory, kir2ServiceFactory)
        { }

        public DataSourceResult GetKirAlkalmazottakGrid(string data, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var searchModel = JsonConvert.DeserializeObject<KirSearchModel>(data);
            KirSearchModel.ValidateModel(searchModel);
            new KirImportLogic().SetKirKretaKod(KirImportHelper, searchModel.KirTelephelyId.Value, KirKretaKodCacheKey);

            List<KirAlkalmazott> kirPedagogusAdatModelList = KirImportHelper.GetKirFelhasznaloList<KirAlkalmazott>(searchModel, KirPedagugisListCacheKey);

            var helper = new AlkalmazottHelper(ConnectionTypeExtensions.GetSessionConnectionType())
            {
                GridParameters = Converter.GridParameter(request)
            };

            var kretaAlkalmazottList = helper.SearchAlkalmazottForKir(searchModel);

            return KirImportLogic.MergeKretaKirFelhasznalo(kretaAlkalmazottList, kirPedagogusAdatModelList, searchModel.StatuszSearch)
                .ToDataSourceResult();
        }

        public DataSourceResult GetAlkalmazottAlapadatokGrid(int felhasznaloId)
        {
            var helper = new AlkalmazottHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var kirAlkalmazott = helper.GetAlkalmazottAlapadatok(felhasznaloId);

            KirAlkalmazottAlapadatok kirAlkalmazottFromKir = KirImportHelper
            .GetKirFelhasznaloAdatok(new Converter<KirAlkalmazott, KirAlkalmazottAlapadatok>((y) => y), KirPedagugisListCacheKey, kirAlkalmazott.SzuletesiNev, kirAlkalmazott.AnyjaNeve, kirAlkalmazott.SzuletesiDatum.Value, kirAlkalmazott.SzuletesiHely);

            return KirImportLogic.KirModelEqual(kirAlkalmazott, kirAlkalmazottFromKir)
                .ToDataSourceResult();
        }

        public DataSourceResult GetAlkalmazottElerhetosegAdatokGrid(int felhasznaloId)
        {
            var helper = new FelhasznaloHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var kirAlkalmazott = helper.GetFelhasznaloElerhetoseg(felhasznaloId, isTanulo: false);

            KirFelhasznaloElerhetosegek kirAlkalmazottFromKir = KirImportHelper
                .GetKirFelhasznaloAdatok(new Converter<KirAlkalmazott, KirFelhasznaloElerhetosegek>((y) => y), KirPedagugisListCacheKey, kirAlkalmazott.SzuletesiNev, kirAlkalmazott.AnyjaNeve, kirAlkalmazott.SzuletesiDatum.Value, kirAlkalmazott.SzuletesiHely);

            kirAlkalmazott.SzuletesiDatum = null;
            kirAlkalmazott.SzuletesiHely = null;

            return KirImportLogic.KirModelEqual(kirAlkalmazott, kirAlkalmazottFromKir)
                .ToDataSourceResult();
        }

        public DataSourceResult GetAlkalmazottElsodlegesMunkaugyiAdatokGrid(int felhasznaloId)
        {
            var helper = new AlkalmazottHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var kirAlkalmazott = helper.GetAlkalmazottElsodlegesMunkaugyiAdatok(felhasznaloId);

            KirAlkalmazottMunkaugyiAdatok kirAlkalmazottFromKir = KirImportHelper
            .GetKirFelhasznaloAdatok(new Converter<KirAlkalmazott, KirAlkalmazottMunkaugyiAdatok>((y) => y), KirPedagugisListCacheKey, kirAlkalmazott.SzuletesiNev, kirAlkalmazott.AnyjaNeve, kirAlkalmazott.SzuletesiDatum.Value, kirAlkalmazott.SzuletesiHely);

            kirAlkalmazott.SzuletesiDatum = null;
            kirAlkalmazott.SzuletesiHely = null;

            return KirImportLogic.KirModelEqual(kirAlkalmazott, kirAlkalmazottFromKir)
                .ToDataSourceResult();
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage ModifyAlkalmazott(KirSzinkronSaveModel postData)
        {
            int felhasznaloId = 0;

            if (!string.IsNullOrWhiteSpace(postData.FelhasznaloId))
            {
                int.TryParse(postData.FelhasznaloId, out felhasznaloId);
            }

            try
            {
                if (felhasznaloId != 0)
                {
                    new KirImportLogic().UpdateAlkalmazott(postData, felhasznaloId);

                    return new HttpResponseMessage(HttpStatusCode.OK);
                }

                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ErrorResource.NemSikerultASzinkronizalas);
            }
            catch (BlException e)
            {
                throw new StatusError(HttpStatusCode.BadRequest, e.Message);
            }
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage ModifySelected(List<SaveModel> azonositoList)
        {
            try
            {
                List<KirAlkalmazott> kirPedagogusAdatModelList = KirImportHelper.GetKirFelhasznaloList<KirAlkalmazott>(KirPedagugisListCacheKey);
                var kirImportLogic = new KirImportLogic();

                foreach (var azonosito in azonositoList)
                {
                    if (int.TryParse(azonosito.FelhasznaloId, out int felhasznaloId))
                    {
                        KirAlkalmazott kirAlkalmazott = kirPedagogusAdatModelList.Where(x => x.OktatasiAzonosito.Equals(azonosito.OktatasiAzonosito)).FirstOrDefault();

                        if (kirAlkalmazott != null)
                        {
                            kirImportLogic.UpdateAlkalmazott(kirAlkalmazott, felhasznaloId);
                        }
                    }
                    else
                    {
                        kirImportLogic.InsertAlkalmazott(kirPedagogusAdatModelList.Where(x => x.OktatasiAzonosito.Equals(azonosito.OktatasiAzonosito)).First());
                    }
                }

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (BlException e)
            {
                throw new StatusError(HttpStatusCode.BadRequest, e.Message);
            }
        }
    }
}