@page "/CalculoCDCI"
@inject NavigationManager Navigation
@layout ConfiguracionLayout
@using BlazorBootstrap
@using System.Globalization
@using bdHerramientaCACOA.db
<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />

<div class="container-fluid">
    <span>Usa esta herramienta para ver como se calcula la tabla de CD+CI que se utiliza en los calculos</span>
    <br />
    <span>Seleccione una Provincia: </span>
    <InputSelect @bind-Value="@convenioSeleccionado" class="inputForm" @oninput="e => CalcularTabla(e.Value.ToString())">
        <option value="">Estatal</option>
        <option value="04">Almería</option>
        <option value="11">Cádiz</option>
        <option value="14">Córdoba</option>
        <option value="18">Granada</option>
        <option value="15">Huelva</option>
        <option value="29">Málaga</option>
        <option value="41">Sevilla</option>
    </InputSelect>
    <br>
    <b>Equipo de trabajo minimo:</b>
    <br />
    <div class="d-flex" style="">
        Titulado grado superior: <br />
        <InputNumber TValue="int" Locale="es-ES" Min="0" class="inputForm formatoMoneda" Value="@minimoGradoSuperior" ValueExpression="() => minimoGradoSuperior" ValueChanged="(value) => MinimoSupCambiado(value)"></InputNumber> 
    </div>
    <div class="d-flex" style="">
        Titulado grado medio: <br />
        <InputNumber TValue="int" Locale="es-ES" Min="0" class="inputForm formatoMoneda" Value="@minimoGradoMedio" ValueExpression="() => minimoGradoMedio" ValueChanged="(value) => MinimoMedCambiado(value)"></InputNumber>
    </div>
    <table class="bb-table tablaCACOA table" style="width:275px">
        <tr>
            <td width="120">Téc. Superior</td>
            <td>@ValorTecSuperior</td>
        </tr>
        <tr>
            <td>Téc. Medio</td>
            <td>@ValorTecMedio</td>
        </tr>
        <tr>
            <td>Téc. Medio</td>
            <td>@ValorDelineante</td>
        </tr>
        <tr>
            <td>Jornada Laboral Anual</td>
            <td>@jornadaLaboralAnual</td>
        </tr>
        <tr>
            <td>%Horas Produccion media</td>
            <td>@horasProdMedia</td>
        </tr>
        <tr>
            <td>%Costes Variables</td>
            <td>@porcentajeCostesVariables</td>
        </tr>
        <tr>
            <td>IPC COSTE INDIRECTO</td>
            <td>@ipcCosteDirecto</td>
        </tr>
    </table>

    <Grid TItem="CosteDirectoIndirecto"
    Class="tablaCACOA table"
    Data="listaCDCI"
    AllowFiltering="false"
    PageSize="10"
    Height="100"
    EmptyText="No hay registros."
    PageSizeSelectorVisible="false"
    Responsive="true">
        <GridColumns>
            <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Nº Trabajadores">
                <span>@context.NumeroTrabajadores</span>
            </GridColumn>
            <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end"  HeaderText="Horas Producción Anuales">
                <span>@context.HorasProduccionAnuales</span>
            </GridColumn>
            <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Coste Min Personal">
                <span>@context.CosteMinimoPersonal</span>
            </GridColumn>

            <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Coste Max Personal">
                <span>@context.CosteMaximoPersonal</span>
            </GridColumn>
            <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Coste Directo Medio">
                <span>@context.CosteMedioPersonal</span>
            </GridColumn>
            <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Costes Directos">
                <span>@context.CostesDirectos</span>
            </GridColumn>
            <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Costes Indirectos">
                <span>@context.CostesIndirectos</span>
            </GridColumn>
            <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Costes Variables">
                <span>@context.CostesVariables</span>
            </GridColumn>
            <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Total Costes">
                <span>@context.TotalDespachoProfesional</span>
            </GridColumn>
        </GridColumns>
    </Grid>
</div>

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

    string convenioSeleccionado = "";
    double ValorTecSuperior = 0;
    double ValorTecMedio = 0;
    double ValorDelineante = 0;
    int jornadaLaboralAnual = 0;
    double horasProdMedia = 0;
    double porcentajeCostesVariables = 0;
    double ipcCosteDirecto = 1;
    int minimoGradoSuperior = 1;
    int minimoGradoMedio = 0;

    List<CosteDirectoIndirecto> listaCDCI { get; set; } = new List<CosteDirectoIndirecto>();
    protected override async Task OnInitializedAsync()
    {
        bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false);
        CalcularTabla("");
    }
    private async Task MinimoSupCambiado(int valor)
    {
        if (valor < 1)
        {
            minimoGradoSuperior = 1;
        }
        else
        {
            minimoGradoSuperior = valor;
        }
        CalcularTabla(convenioSeleccionado);
    }
    private async Task MinimoMedCambiado(int valor)
    {

        minimoGradoMedio = valor;
        CalcularTabla(convenioSeleccionado);
    }
    private async Task CalcularTabla(string idProvincia)
    {
        listaCDCI = new List<CosteDirectoIndirecto>();
        //Obtenemos variables a utilizar
        jornadaLaboralAnual =(int) bd.enumeraciones.First(x => x.Codigo == "VARCASA.JORLABANUAL").ValorNumerico1;
        horasProdMedia =(double) bd.enumeraciones.First(x => x.Codigo == "VARCASA.HORPRODMEDIA").ValorNumerico1;
        porcentajeCostesVariables = (double)bd.enumeraciones.First(x => x.Codigo == "VARCASA.COSTESVARIABLES").ValorNumerico1;
        ipcCosteDirecto = (double)bd.enumeraciones.First(x => x.Codigo == "VARCASA.IPCCD").ValorNumerico1;

        var idGradSup = bd.enumeraciones.First(x => x.Codigo == "PUESTOTRABAJO.TECGRADSUP").idEnumeracion;
        var idGradMed = bd.enumeraciones.First(x => x.Codigo == "PUESTOTRABAJO.GESTPROY").idEnumeracion;
        var idDelin = bd.enumeraciones.First(x => x.Codigo == "PUESTOTRABAJO.DELINPROY").idEnumeracion;
        if(idProvincia== ""){ idProvincia = null; }

        ValorTecSuperior = bd.conveniocolectivo.FirstOrDefault(x => x.idProvincia == idProvincia && x.idEnumeracion == idGradSup) != null ? bd.conveniocolectivo.First(x => x.idProvincia == idProvincia && x.idEnumeracion == idGradSup).CosteAnualTrabajador : 0;
        ValorTecMedio = bd.conveniocolectivo.FirstOrDefault(x => x.idProvincia == idProvincia && x.idEnumeracion == idGradMed) != null ? bd.conveniocolectivo.First(x => x.idProvincia == idProvincia && x.idEnumeracion == idGradMed).CosteAnualTrabajador : 0;
        ValorDelineante = bd.conveniocolectivo.FirstOrDefault(x => x.idProvincia == idProvincia && x.idEnumeracion == idDelin) != null ? bd.conveniocolectivo.First(x => x.idProvincia == idProvincia && x.idEnumeracion == idDelin).CosteAnualTrabajador : 0; ;

        double masCaro = Math.Max(ValorTecSuperior, Math.Max(ValorTecMedio, ValorDelineante));
        double masBarato = Math.Min(ValorTecSuperior, Math.Min(ValorTecMedio, ValorDelineante));

        int minimoTrabajadores = minimoGradoMedio + minimoGradoSuperior;
        //Se calcula 
        //listaCDCI.Add(new CosteDirectoIndirecto(1, 1 * ValorTecSuperior, 1 * ValorTecSuperior, jornadaLaboralAnual, horasProdMedia, porcentajeCostesVariables));
        if (minimoTrabajadores == 1 && minimoGradoSuperior == 1)
        {//Se calcula como siempre, el calculo de licitaciones CASA
            for (int i = 2; i <= 20; i++)
            {
                double costeMinimo = ValorTecSuperior + (masBarato * (i - 1));
                double costeMaximo = ValorTecSuperior + (masCaro * (i - 1));
                listaCDCI.Add(new CosteDirectoIndirecto(i, costeMinimo, costeMaximo, jornadaLaboralAnual, horasProdMedia, porcentajeCostesVariables, ipcCosteDirecto));
            }
        }
        else
        {//Se calcula con minimos, por si ponen minimos en licitaciones URBAN
            for (int i = minimoTrabajadores+1; i <= 20; i++)
            {
                var numresto = i - minimoTrabajadores;
                double costeMinimo = (ValorTecSuperior*minimoGradoSuperior)+(ValorTecMedio*minimoGradoMedio) + (masBarato * numresto);
                double costeMaximo = (ValorTecSuperior * minimoGradoSuperior) + (ValorTecMedio * minimoGradoMedio) + (masCaro * (numresto));
                listaCDCI.Add(new CosteDirectoIndirecto(i, costeMinimo, costeMaximo, jornadaLaboralAnual, horasProdMedia, porcentajeCostesVariables, ipcCosteDirecto));
            }
        }

    }
}

