@page "/Estadisticas"

@inject NavigationManager Navigation
@layout ConfiguracionLayout
@using Microsoft.AspNetCore.WebUtilities

@using BlazorBootstrap
@using System.Globalization
@using bdHerramientaCACOA.db
@rendermode InteractiveServer
@inject IJSRuntime JS

@using ClosedXML.Excel
@using Microsoft.EntityFrameworkCore

<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />


<div class="row container-fluid mt-4" style="justify-content:space-between">
    <div class="form-group mt-4 col-6">
        <label>Fecha inicio:</label>
        <InputDate TValue="DateTime?"
                   Value="fechaInicio"
                   ValueChanged="OnFechaInicioChanged"
                   ValueExpression="@(() => fechaInicio)" />

        <label>Fecha final:</label>
        <InputDate TValue="DateTime?"
                   Value="fechaFinal"
                   ValueChanged="OnFechaFinalChanged"
                   ValueExpression="@(() => fechaFinal)" />

    </div>



    <div class="mt-2">
        @if (!string.IsNullOrEmpty(mensajeError))
        {
            <label class="text-danger fw-semibold">
                @mensajeError
            </label>
        }
    </div>


</div>

<div class="container-fluid pt-3">

    <Tabs>
        <Tab Title="Estadisticas CASA - Edificación" Active>
            <Content>
                <div class="CajaTab p-2">
                    <CascadingValue Value="this">
                        <HerramientaCASA.Components.Pages.ConfiguracionPages.EstadisticasTabs.EstadisticaHerraCASATab ListadoHerraCASA="@listadoHerramientaEstadistica" ListadoFactoresCASA="listadoHerramientaEstadisticaFactores" ListadoUsosCASA="listadoHerramientaEstadisticaUsos"></HerramientaCASA.Components.Pages.ConfiguracionPages.EstadisticasTabs.EstadisticaHerraCASATab>
                    </CascadingValue>
                </div>
            </Content>

        </Tab>

        <Tab Title="Estadisticas Licitaciones Edificación">
            <Content>
                <div class="CajaTab p-2">
                    <CascadingValue Value="this">
                        <HerramientaCASA.Components.Pages.ConfiguracionPages.EstadisticasTabs.EstadisticaLiciCASATab ListadoLiciCASA="@listadoLicitacionesEstadistica" ListadoUsosLicitacion="listadoLicitacionUsos"></HerramientaCASA.Components.Pages.ConfiguracionPages.EstadisticasTabs.EstadisticaLiciCASATab>
                    </CascadingValue>

                </div>
            </Content>
        </Tab>

        <Tab Title="Estadisticas CASA - Urbanismo">
            <Content>
                <div class="CajaTab p-2">
                    <CascadingValue Value="this">

                        <HerramientaCASA.Components.Pages.ConfiguracionPages.EstadisticasTabs.EstadisticaHerraURBANTab ListadoHerraURBAN="@listadoHerramientaEstadisticaUrban"></HerramientaCASA.Components.Pages.ConfiguracionPages.EstadisticasTabs.EstadisticaHerraURBANTab>
                    </CascadingValue>

                </div>
            </Content>
        </Tab>

        <Tab Title="Estadisticas Licitación Urbanismo">
            <Content>
                <div class="CajaTab p-2">
                    <CascadingValue Value="this">

                        <HerramientaCASA.Components.Pages.ConfiguracionPages.EstadisticasTabs.EstadisticaLiciURBANTab ListadoLiciURBAN="@listadoLicitacionesEstadisticaUrban"></HerramientaCASA.Components.Pages.ConfiguracionPages.EstadisticasTabs.EstadisticaLiciURBANTab>
                    </CascadingValue>

                </div>
            </Content>
        </Tab>
    </Tabs>
</div>


@code {

    public List<estadisticas> listadoHerramientaEstadistica { get; set; } = new List<estadisticas>();
    public List<estadisticas> listadoLicitacionesEstadistica { get; set; } = new List<estadisticas>();

    public List<estadisticas> listadoHerramientaEstadisticaUrban { get; set; } = new List<estadisticas>();
    public List<estadisticas> listadoLicitacionesEstadisticaUrban { get; set; } = new List<estadisticas>();

    public List<estadisticasusos> listadoHerramientaEstadisticaUsos { get; set; } = new List<estadisticasusos>();
    public List<estadisticasusos> listadoLicitacionUsos { get; set; } = new List<estadisticasusos>();
    public List<estadisticasfactores> listadoHerramientaEstadisticaFactores { get; set; } = new List<estadisticasfactores>();

    public DateTime? fechaInicio { get; set; } = null;
    public DateTime? fechaFinal { get; set; } = null;

    public EstadistiaHerraCasaVM estadisticasTotales = new EstadistiaHerraCasaVM();
    private int totalProyectosTipo = 0;

    private string mensajeError = "";

    public tsHerramientasCACOA bd;
    List<ToastMessage> mensajes = new List<ToastMessage>();


    private async Task OnFechaInicioChanged(DateTime? value)
    {
        fechaInicio = value;

        if (UtilidadesCASA.comprobarFechasNulas(fechaInicio, fechaFinal))
        {
            if (UtilidadesCASA.comprobarFechas((DateTime)fechaInicio, (DateTime)fechaFinal))
            {
                inicializarListado();
                mensajeError = "";
            }
            else
            {
                mensajeError = "La fecha final no puede ser menor que la fecha inicial.";
            }
        }
        else
        {
            inicializarListado();
            mensajeError = "";
        }



    }

    public bool IsVisible(bdHerramientaCACOA.db.estadisticas listado)
    {
        DateTime? ultimaFecha;
        if (listado.idSimulacionNavigation.FechaModificacion != null)
        {
            ultimaFecha = listado.idSimulacionNavigation.FechaModificacion;
        }
        else
        {
            ultimaFecha = listado.idSimulacionNavigation.FechaCreacion;
        }

        if (fechaFinal != null && listado.idSimulacionNavigation.FechaCreacion.Date >= fechaInicio?.Date && ultimaFecha?.Date <= fechaFinal?.Date)
        {
            return true;
        }

        return false;
    }

    private async Task OnFechaFinalChanged(DateTime? value)
    {
        fechaFinal = value;

        if (UtilidadesCASA.comprobarFechasNulas(fechaInicio, fechaFinal))
        {

            if (UtilidadesCASA.comprobarFechas((DateTime)fechaInicio, (DateTime)fechaFinal))
            {
                inicializarListado();
                mensajeError = "";
            }
            else
            {
                mensajeError = "La fecha final no puede ser menor que la fecha inicial.";
            }
        }
        else
        {
            inicializarListado();
            mensajeError = "";
        }
    }


    public async Task generarExcel(byte[] arrayListados)
    {
        try
        {
            bool fechaValida = false;

            string nombreExcel = "";


            if ((fechaInicio == null && fechaFinal == null) || (UtilidadesCASA.comprobarFechasNulas(fechaInicio, fechaFinal) && UtilidadesCASA.comprobarFechas((DateTime)fechaInicio, (DateTime)fechaFinal)))
            {
                fechaValida = true;
            }

            if (fechaValida)
            {

                if (UtilidadesCASA.comprobarFechasNulas(fechaInicio, fechaFinal))
                {
                    nombreExcel = "Simulaciones_" + (fechaInicio ?? DateTime.Now).Date.ToString() + (fechaFinal ?? DateTime.Now).Date.ToString() + ".xlsx";
                }
                else
                {
                    nombreExcel = "SimulacionesTotales_" + DateTime.Now.ToString() + ".xlsx";
                }
                var wb = new XLWorkbook();
                wb.Properties.Author = "Tecnosis";
                wb.Properties.Title = "Datos entre fechas";
                wb.Properties.Subject = "";

                var ws = wb.Worksheets.Add("Total datos");

                var bytes = arrayListados;

                await JS.InvokeVoidAsync("descargarExcel", nombreExcel, Convert.ToBase64String(bytes));

                mensajes.Add(new ToastMessage
                {
                    Type = ToastType.Primary,
                    Message = $"Descarga completada.",
                });
            }
            else
            {
                mensajes.Add(new ToastMessage
                {
                    Type = ToastType.Warning,
                    Message = $"Fechas incorrectas.",
                });
            }
        }
        catch (Exception ex)
        {
            mensajes.Add(new ToastMessage
            {
                Type = ToastType.Danger,
                Message = $"Error al generar el excel.",
            });
            throw new Exception("Ocurrió un error en la descarga del excel -> " + ex.Message);
        }
    }
    protected override async Task OnInitializedAsync()
    {
        bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false);

        inicializarListado();
    }







    private void inicializarListado()
    {

        if (fechaInicio == null)
        {
            listadoHerramientaEstadistica = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 31).ToList();
            listadoLicitacionesEstadistica = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 32).ToList();

            listadoHerramientaEstadisticaUrban = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 34).ToList();
            listadoLicitacionesEstadisticaUrban = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 35).ToList();

        }
        else
        {
            var listadoHerraCASA = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 31).ToList();
            var listadoLicitacionCASA = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 32).ToList();

            listadoHerramientaEstadistica = listadoHerraCASA.Where(x => (x.idSimulacionNavigation.FechaCreacion >= fechaInicio) && (x.idSimulacionNavigation.FechaModificacion ?? x.idSimulacionNavigation.FechaCreacion).Date <= fechaFinal).ToList();
            listadoLicitacionesEstadistica = listadoHerraCASA.Where(x => (x.idSimulacionNavigation.FechaCreacion >= fechaInicio) && (x.idSimulacionNavigation.FechaModificacion ?? x.idSimulacionNavigation.FechaCreacion).Date <= fechaFinal).ToList();

            var listadoPorTipoURBAN = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 34 || x.idSimulacionNavigation.idTipoSimulacion == 35).ToList();

            listadoHerramientaEstadisticaUrban = listadoPorTipoURBAN.Where(x => (x.idSimulacionNavigation.FechaCreacion >= fechaInicio) && (x.idSimulacionNavigation.FechaModificacion ?? x.idSimulacionNavigation.FechaCreacion).Date <= fechaFinal).ToList();

        }

        listadoHerramientaEstadisticaUsos = bd.estadisticasusos.AsEnumerable().Where(x => listadoHerramientaEstadistica.Any(y => y.idSimulacion == x.idSimulacion)).ToList();
        listadoLicitacionUsos = bd.estadisticasusos.AsEnumerable().Where(x => listadoLicitacionesEstadistica.Any(y => y.idSimulacion == x.idSimulacion)).ToList();

        listadoHerramientaEstadisticaFactores = bd.estadisticasfactores.AsEnumerable().Where(x => listadoHerramientaEstadistica.Any(y => y.idSimulacion == x.idsimulacion)).ToList();
    }
}
