using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.ModelBinding;
using Kendo.Mvc.UI;
using Kreta.BusinessLogic.Exceptions;
using Kreta.BusinessLogic.HelperClasses;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Security;
using Kreta.Resources;
using Kreta.Web.Areas.TanuloErtekeles.Models;
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.TanuloErtekeles.ApiControllers
{
    [ApiRoleClaimsAuthorize(true)]
    [ApiRolePackageAuthorize(KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue)]
    public class ErettsegiEredmenyekApiController : ApiController
    {
        public DataSourceResult GetErettsegiEredmenyekGrid(string data, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var model = JsonConvert.DeserializeObject<ErettsegiEredmenyekModel>(data);

            if (model == null || !model.OsztalyId.HasValue)
            {
                return new DataSourceResult();
            }

            var authorization = (IKretaAuthorization)Request.GetDependencyScope().GetService(typeof(IKretaAuthorization));
            if (!authorization.IsValidOsztaly(model.OsztalyId.Value))
            {
                throw new StatusError(HttpStatusCode.Forbidden, ErrorResource.AFelhasznalonakNincsMegfeleloJogosultsagaAFunkcioHasznalatahoz);
            }

            var helper = new ErettsegiEredmenyekHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType())
            {
                GridParameters = Converter.GridParameter(request)
            };

            var ds = helper.GetErettsegiEredmenyekGrid(model.OsztalyId.Value);

            DataSourceResult result = ds.ToDataSourceResult();

            return result;
        }

        public DataSourceResult GetErettsegiEredmenyekDetailGrid(int tanuloId, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var authorization = (IKretaAuthorization)Request.GetDependencyScope().GetService(typeof(IKretaAuthorization));
            if (!authorization.IsValidOsztalyfonokTanuloja(tanuloId))
            {
                throw new StatusError(HttpStatusCode.Forbidden, ErrorResource.AFelhasznalonakNincsMegfeleloJogosultsagaAFunkcioHasznalatahoz);
            }

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

            var ds = helper.GetErettsegiEredmenyekDetailGrid(tanuloId);

            DataSourceResult result = ds.ToDataSourceResult();

            return result;
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage SaveErettsegiEredmenyList(List<ErettsegiEredmenySaveModel> erettsegiEredmenySaveModelList)
        {
            var helper = new ErettsegiEredmenyekHelper(ConnectionTypeExtensions.GetSessionConnectionType());

            var erettsegiTantargyAdatok = helper.GetErettsegiTantargyakForValidate();

            List<ErettsegiEredmenyItemCo> erettsegiEredmenyCoList = new List<ErettsegiEredmenyItemCo>();
            foreach (var erettsegiEredmenySaveModel in erettsegiEredmenySaveModelList)
            {
                var modelStateDictionary = new ModelStateDictionary();
                foreach (var erettsegiEredmenySaveDetailModel in erettsegiEredmenySaveModel.ErettsegiEredmenySaveDetailModelList)
                {
                    modelStateDictionary = erettsegiEredmenySaveDetailModel.Validate(modelStateDictionary, erettsegiEredmenySaveModel.FormName, erettsegiTantargyAdatok);
                    erettsegiEredmenyCoList.Add(erettsegiEredmenySaveDetailModel.ConvertModelToCo(ClaimData.IntezmenyId, ClaimData.SelectedTanevID.Value));
                }
                ModelState.Merge(modelStateDictionary);
            }

            if (ModelState.IsValid)
            {
                var authorization = (IKretaAuthorization)Request.GetDependencyScope().GetService(typeof(IKretaAuthorization));
                foreach (ErettsegiEredmenyItemCo erettsegiEredmenyCo in erettsegiEredmenyCoList)
                {
                    if (!authorization.IsValidOsztalyfonokTanuloja(erettsegiEredmenyCo.TanuloId))
                    {
                        throw new StatusError(HttpStatusCode.Forbidden, ErrorResource.AFelhasznalonakNincsMegfeleloJogosultsagaAFunkcioHasznalatahoz);
                    }
                }

                helper.SaveErettsegiEredmenyList(erettsegiEredmenyCoList);

                return new HttpResponseMessage(HttpStatusCode.OK);
            }

            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }

        [HttpPost]
        [ApiValidateAjaxAntiForgeryToken]
        public HttpResponseMessage DeleteErettsegiEredmeny([FromBody] int id)
        {
            var authorization = (IKretaAuthorization)Request.GetDependencyScope().GetService(typeof(IKretaAuthorization));
            if (!authorization.IsValidErettsegiEredmeny(id))
            {
                throw new StatusError(HttpStatusCode.Forbidden, ErrorResource.AFelhasznalonakNincsMegfeleloJogosultsagaAFunkcioHasznalatahoz);
            }

            try
            {
                var helper = new ErettsegiEredmenyekHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());

                helper.DeleteErettsegiEredmeny(id);

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