using System.Collections.Generic;
using System.Data;
using System.Net.Http;
using System.Web.Http.ModelBinding;
using Kendo.Mvc.UI;
using Kreta.BusinessLogic.HelperClasses;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Security;
using Kreta.Core;
using Kreta.Enums.ManualEnums;
using Kreta.Web.Areas.Hianyzas.Models;
using Kreta.Web.Areas.Hianyzas.Models.Mulasztasok;
using Kreta.Web.Helpers;
using Kreta.Web.Helpers.Grid;
using Kreta.Web.Security;
using Newtonsoft.Json;

namespace Kreta.Web.Areas.Hianyzas.ApiControllers
{
    [ApiRoleClaimsAuthorize(true)]
    [ApiRolePackageAuthorize(KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue,
        KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.Naplo.ClaimValue)]
    public class MulasztasokApiController : BaseMulasztasokApiController
    {
        #region Dátum nézet

        //Mulasztásos napok lekérdezése a dátum nézethez
        [ApiRolePackageAuthorize(KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue,
            KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue, KretaClaimPackages.Naplo.ClaimValue)]
        public DataSourceResult GetMulasztasokDatumNezetGrid(string data, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var model = JsonConvert.DeserializeObject<MulasztasIndexModel>(data);

            if (!model.OsztalyCsoportId.HasValue && !model.CsoportId.HasValue)
            {
                return new DataSourceResult();
            }

            bool isFromCsopvez = model.CsoportId.HasValue;
            int osztalyCsoportId;
            if (isFromCsopvez)
            {
                CheckCsoport(model.CsoportId.Value);
                osztalyCsoportId = model.CsoportId.Value;
            }
            else
            {
                CheckOsztalyCsoport(model.OsztalyCsoportId.Value);
                osztalyCsoportId = model.OsztalyCsoportId.Value;
            }

            DataSet ds;
            var helper = new MulasztasHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());

            helper.GridParameters = Converter.GridParameter(request);
            if (string.IsNullOrWhiteSpace(helper.GridParameters.OrderBy))
            {
                helper.GridParameters.OrderBy = "MulasztasDatuma DESC";
            }

            ds = helper.GetDatumNezetDataByOsztalyCsoportId(osztalyCsoportId, isFromCsopvez || IsCsoportVezeto());

            return ds.ToDataSourceResult();
        }

        //Mulasztasok lekérdezése dátum alapján
        [ApiRolePackageAuthorize(KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue,
            KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue)]
        public DataSourceResult GetMulasztasokDatumNezetDetailGrid(string model, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var mulasztasModel = JsonConvert.DeserializeObject<MulasztasokDatumNezetGridModel>(model);

            bool isFromCsopvez = mulasztasModel.SzerepkorViewType == SzerepkorViewTypeEnum.CsoportvezetoNezet;

            if (isFromCsopvez)
            {
                CheckCsoport(mulasztasModel.OsztalyCsoportId);
            }
            else
            {
                CheckOsztalyCsoport(mulasztasModel.OsztalyCsoportId);
            }

            DataSet ds;
            var helper = new MulasztasHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());

            helper.GridParameters = Converter.GridParameter(request);
            if (string.IsNullOrWhiteSpace(helper.GridParameters.OrderBy))
            {
                helper.GridParameters.OrderBy = "Oraszam ASC";
            }

            ds = helper.GetMulasztasokDatumNezetDetailGrid(mulasztasModel.MulasztasDatuma, mulasztasModel.OsztalyCsoportId, (isFromCsopvez || IsCsoportVezeto()));

            #region "Header helyett nulladik sor, ha"
            //NOTE: "Ideiglenesen mivel a grid headerbe nincs lehetőség az összes oszlopérték beállítására egyszerre, ezért bekerül egy nulladik sor, amivel állítani lehet..."

            if (!isFromCsopvez
                || (mulasztasModel.IsTanorai == false && mulasztasModel.MulasztasJogosultsagSetting != CsoportvezetokIgazolasiJogosultsagaEnum.NemIgazolhatnak))
            {
                DataRow dr = ds.Tables[0].NewRow();
                dr["ID"] = 0;
                dr["TanuloNev"] = "";
                ds.Tables[0].Rows.InsertAt(dr, 0);
            }

            #endregion "Header helyett nulladik sor, ha"

            return ds.ToDataSourceResult();
        }

        #endregion Dátum nézet

        #region Tanuló nézet

        [ApiRolePackageAuthorize(KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue, KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue)]
        public DataSourceResult GetMulasztasokTanuloNezetGrid(string data, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var model = JsonConvert.DeserializeObject<MulasztasSearchModel>(data);

            var osztalyCsoportId = model.OsztalyCsoportId;
            var tanuloId = model.TanuloId;

            if (!osztalyCsoportId.IsEntityId() && !tanuloId.IsEntityId())
            {
                return new DataSourceResult();
            }
            if (osztalyCsoportId.IsEntityId())
            {
                CheckOsztalyCsoport(osztalyCsoportId.Value);
            }
            if (tanuloId.IsEntityId())
            {
                CheckTanulo(tanuloId.Value);
            }

            DataSet ds;
            var helper = new MulasztasHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());

            helper.GridParameters = Converter.GridParameter(request);
            ds = helper.GetTanulokMulasztasaiKesesei(osztalyCsoportId, tanuloId, IsCsoportVezeto());

            DataSourceResult result = ds.ToDataSourceResult();
            return result;
        }

        public DataSourceResult GetMulasztasokTanuloNezetDetailGrid(int tanuloId, int osztalyCsoportId, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            CheckTanulo(tanuloId);

            var coList = new MulasztasHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetMulasztasokTanuloDetailGridItemCoList(new MulasztasokCo { TanuloId = tanuloId, OsztCsop = osztalyCsoportId == default ? default(int?) : osztalyCsoportId, KapcsCsop = true }, true, csoportVezetoId: IsCsoportVezeto() ? ClaimData.FelhasznaloId : (int?)null);
            var modelList = new List<MulasztasGridModel>();

            foreach (var item in coList)
            {
                var gridModel = new MulasztasGridModel(item);
                modelList.Add(gridModel);
            }

            var gridParameter = Converter.GridParameter(request);

            return modelList.ToDataSourceResult(gridParameter);
        }

        #endregion Tanuló nézet

        #region Napló nézet

        public DataSourceResult GetMulasztasokNaploNezetGrid(string data, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var model = JsonConvert.DeserializeObject<MulasztasSearchModel>(data);

            if (!model.OsztalyCsoportId.HasValue || !model.NaploNezetDatum.HasValue)
            {
                return new DataSourceResult();
            }

            CheckOsztalyCsoport(model.OsztalyCsoportId.Value);

            DataSet ds;
            var helper = new MulasztasHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());

            helper.GridParameters = Converter.GridParameter(request);
            if (string.IsNullOrWhiteSpace(helper.GridParameters.OrderBy))
            {
                helper.GridParameters.OrderBy = "TanuloNev ASC";
            }

            ds = helper.GetMulasztasokNaploNezetGrid(model.OsztalyCsoportId.Value, model.NaploNezetDatum.Value, IsCsoportVezeto());

            DataSourceResult result = ds.ToDataSourceResult();

            return result;
        }

        #endregion

        #region Tanuló popup

        [ApiRolePackageAuthorize(KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue,
            KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue)]
        public DataSourceResult GetTanuloMulasztasaiGrid(string data, bool igazolandok, bool isTanorai, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var model = JsonConvert.DeserializeObject<TanuloMulasztasaiPopupModel>(data);
            CheckTanulo(model.TanuloId);

            DataSet ds;
            var helper = new MulasztasHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());

            helper.GridParameters = Converter.GridParameter(request);
            if (string.IsNullOrWhiteSpace(helper.GridParameters.OrderBy))
            {
                helper.GridParameters.OrderBy = "MulasztasDatuma DESC";
            }

            bool isCsoportVezeto;
            bool? isTanoraiCelu = null;
            if (model.SzerepkorViewType == SzerepkorViewTypeEnum.CsoportvezetoNezet)
            {
                isCsoportVezeto = true;
                isTanoraiCelu = isTanorai;
            }
            else
            {
                isCsoportVezeto = IsCsoportVezeto();
            }

            ds = helper.GetTanuloMulasztasaiGrid(model.TanuloId, ClaimData.AktivTanevID.Value, igazolandok, isTanoraiCelu, isCsoportVezeto ? ClaimData.FelhasznaloId : (int?)null, model.OsztalyCsoportId);

            return ds.ToDataSourceResult();
        }

        [ApiRolePackageAuthorize(KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue,
            KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue)]
        public DataSourceResult GetTanuloMulasztasaiDetailGrid(string model, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
        {
            var mulasztasModel = JsonConvert.DeserializeObject<TanuloMulasztasaiPopupModel>(model);
            CheckTanulo(mulasztasModel.TanuloId);

            DataSet ds;
            var helper = new MulasztasHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());

            helper.GridParameters = Converter.GridParameter(request);
            if (string.IsNullOrWhiteSpace(helper.GridParameters.OrderBy))
            {
                helper.GridParameters.OrderBy = "Oraszam ASC";
            }

            bool isCsoportVezeto;
            bool? isTanorai = null;
            if (mulasztasModel.SzerepkorViewType == SzerepkorViewTypeEnum.CsoportvezetoNezet)
            {
                isCsoportVezeto = true;
                isTanorai = mulasztasModel.IsTanorai;
            }
            else
            {
                isCsoportVezeto = IsCsoportVezeto();
            }
            var mulasztasokCo = new MulasztasokCo
            {
                Tol = mulasztasModel.MulasztasDatuma,
                Ig = mulasztasModel.MulasztasDatuma,
                OsztalyFonokId = ClaimData.FelhasznaloId,
                OsztCsop = mulasztasModel.OsztalyCsoportId,
                TanuloId = mulasztasModel.TanuloId
            };
            ds = helper.GetTanuloMulasztasaiDetailGrid(mulasztasokCo, mulasztasModel.Kezeletlen, isTanorai, isCsoportVezeto ? ClaimData.FelhasznaloId : (int?)null);

            #region "Header helyett nulladik sor, ha"
            //NOTE: "Ideiglenesen mivel a grid headerbe nincs lehetőség az összes oszlopérték beállítására egyszerre, ezért bekerül egy nulladik sor, amivel állítani lehet..."
            if (mulasztasModel.SzerepkorViewType == SzerepkorViewTypeEnum.OsztalyfonokNezet
                || (mulasztasModel.SzerepkorViewType == SzerepkorViewTypeEnum.CsoportvezetoNezet
                    && mulasztasModel.IsTanorai == false && mulasztasModel.MulasztasJogosultsagSetting != CsoportvezetokIgazolasiJogosultsagaEnum.NemIgazolhatnak))
            {
                DataRow dr = ds.Tables[0].NewRow();
                dr["ID"] = 0;
                dr["TargyNev"] = "";
                ds.Tables[0].Rows.InsertAt(dr, 0);
            }

            #endregion "Header helyett nulladik sor, ha"

            return ds.ToDataSourceResult();
        }

        #endregion Tanuló popup

        [ApiRolePackageAuthorize(KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue,
            KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.CsoportVezeto.ClaimValue)]
        public HttpResponseMessage SaveMulasztasList(List<MulasztasokSaveModel> list)
        {
            return base.SaveMulasztasList(list);
        }

        public HttpResponseMessage SaveNaploNezetMulasztasList(MulasztasokNaploNezetSaveModel model)
        {

            return base.SaveNaploNezetMulasztasList(model);
        }
    }
}