@* @page "/CDCIConf"
@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" />

<Modal @ref="popupConfirmarBorrado" title="" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <div class="col-12 formatoCampos">
            ¿Estás seguro que desea eliminarlo?
        </div>
    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupConfirmarBorrado">Cerrar</Button>
        <Button @onclick="@(() => BorrarItem())" Color="ButtonColor.Danger">Eliminar</Button>
    </FooterTemplate>
</Modal>

<EditForm EditContext="@editContext" OnValidSubmit="guardarFormulario" OnInvalidSubmit="@MostrarErrores" FormName="factoCompleForm">
    <DataAnnotationsValidator></DataAnnotationsValidator>
    <Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
        <BodyTemplate>
            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Nº Trabajadores:</label>
                    <NumberInput TValue="int" @bind-Value="itemSeleccionado.numTrabajadores" @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.numTrabajadores))" class="inputForm"></NumberInput>
                </div>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.numTrabajadores))</div>
            </div>

            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Horas Prod. Anuales:</label>
                    <InputNumber TValue="double" @bind-Value="itemSeleccionado.HorasProduccionAnuales"
                    @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.HorasProduccionAnuales))"
                    class="inputForm" Step="any" />

                </div>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.HorasProduccionAnuales))</div>
            </div>

            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Horas Mínimo Anuales:</label>
                    <InputNumber TValue="double" @bind-Value="itemSeleccionado.CosteMinimoPersonal"
                    @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.CosteMinimoPersonal))"
                    class="inputForm" Step="any" />

                </div>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.CosteMinimoPersonal))</div>
            </div>

            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Coste Máximo Personal:</label>
                    <InputNumber TValue="double" @bind-Value="itemSeleccionado.CosteMaxPersonal"
                    @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.CosteMaxPersonal))"
                    class="inputForm" Step="any" />

                </div>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.CosteMaxPersonal))</div>
            </div>

            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Coste Directo Medio:</label>
                    <InputNumber TValue="double" @bind-Value="itemSeleccionado.HorasProduccionAnuales"
                    @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.HorasProduccionAnuales))"
                    class="inputForm" Step="any" />

                </div>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.HorasProduccionAnuales))</div>
            </div>

            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Costes Directos:</label>
                    <InputNumber TValue="double" @bind-Value="itemSeleccionado.CostesDirectos"
                    @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.CostesDirectos))"
                    class="inputForm" Step="any" />

                </div>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.CostesDirectos))</div>
            </div>

            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Costes Indirectos:</label>
                    <InputNumber TValue="double" @bind-Value="itemSeleccionado.CostesIndirectos"
                    @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.CostesIndirectos))"
                    class="inputForm" Step="any" />

                </div>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.CostesIndirectos))</div>
            </div>

            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Total Despacho Profesional:</label>
                    <InputNumber TValue="double" @bind-Value="itemSeleccionado.TotalDespachoProfesional"
                    @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.TotalDespachoProfesional))"
                                 class="inputForm" Step="InputNumber" />

                </div>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.TotalDespachoProfesional))</div>
            </div>
        </BodyTemplate>
        <FooterTemplate>
            <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupGestionDatos">Cerrar</Button>
            <Button Type="ButtonType.Submit" Color="ButtonColor.Primary">@(nuevoElemento ? "Añadir" : "Modificar")</Button>
        </FooterTemplate>
    </Modal>
</EditForm>

<div class="container-fluid">

    <div class="d-flex justify-content-between mt-3">
        <button @onclick="@(() => abrirPopupGestionDatos(new costedespachoprofesional(),true))" class="btnBlue d-flex align-items-center"> <i class="fas fa-plus-square pe-1"></i> Nuevo CD+CI</button>
    </div>

    <Grid TItem="costedespachoprofesional"
    Class="tablaCACOA table"
    Data="listadoCDCI"
    AllowFiltering="false"
    PageSize="10"
    Height="100"
    EmptyText="No hay registros."
    PageSizeSelectorVisible="false"
    Responsive="true">
        <GridColumns>
            <GridColumn TItem="costedespachoprofesional" HeaderText="Nº Trabajadores">
                <span>@context.numTrabajadores</span>
            </GridColumn>

            <GridColumn TItem="costedespachoprofesional" HeaderText="Horas Prod. Anuales">
                <span>@context.HorasProduccionAnuales</span>
            </GridColumn>

            <GridColumn TItem="costedespachoprofesional" HeaderText="Coste Min. Personal">
                <span>@context.CosteMinimoPersonal</span>
            </GridColumn>

            <GridColumn TItem="costedespachoprofesional" HeaderText="Coste Max. Personal">
                <span>@context.CosteMaxPersonal</span>
            </GridColumn>
            <GridColumn TItem="costedespachoprofesional" HeaderText="Coste Directo Medio">
                <span>@context.CosteDirectoMedio</span>
            </GridColumn>
            <GridColumn TItem="costedespachoprofesional" HeaderText="Costes Directos">
                <span>@context.CostesDirectos</span>
            </GridColumn>
            <GridColumn TItem="costedespachoprofesional" HeaderText="Coste Indirectos">
                <span>@context.CostesIndirectos</span>
            </GridColumn>
            <GridColumn TItem="costedespachoprofesional" HeaderText="Total Despacho Profesional">
                <span>@context.TotalDespachoProfesional</span>
            </GridColumn>
            <GridColumn TItem="costedespachoprofesional" style="text-align: center !important;" HeaderText="">
                <span @onclick="@(() => abrirPopupGestionDatos(@context,false))" style="cursor: pointer;">
                    <Icon CustomIconName="fas fa-edit"></Icon>
                </span>

                <span @onclick="@(() => abrirPopupConfirmarBorrado(@context))" style="cursor: pointer;">
                    <Icon CustomIconName="fas fa-trash"></Icon>
                </span>
            </GridColumn>
        </GridColumns>
    </Grid>
</div>

@code {

    public List<costedespachoprofesional> listadoCDCI { get; set; } = new List<costedespachoprofesional>();

    [SupplyParameterFromForm]
    private costedespachoprofesional itemSeleccionado { get; set; } = new costedespachoprofesional();

    private string tituloPopup = "";
    private Modal popupGestionDatos = default!;
    private Modal popupConfirmarBorrado = default!;

    private bool nuevoElemento;

    List<ToastMessage> mensajes = new List<ToastMessage>();

    private EditContext? editContext;
    private ValidationMessageStore? messageStore;
    public tsHerramientasCACOA bd;
    private string tipoFactorComplejidad = "FACCOMP.";

    protected override async Task OnInitializedAsync()
    {
        bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false);

        editContext = new EditContext(itemSeleccionado);
        messageStore = new ValidationMessageStore(editContext);

        listadoCDCI = bd.costedespachoprofesional.OrderBy(x => x.numTrabajadores).ToList();
    }


    private async Task abrirPopupGestionDatos(costedespachoprofesional objeto, bool esNuevo)
    {
        itemSeleccionado = objeto;

        if (esNuevo)
        {
            nuevoElemento = true;
        }
        else
        {
            nuevoElemento = false;
        }

        if (!nuevoElemento)
        {
            tituloPopup = "Modificar CD+CI";
        }
        else
        {
            tituloPopup = "Nuevo CD+CI";
        }

        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }

    private void ValidarYActualizar(ChangeEventArgs e, string fieldName)
    {
        var value = e.Value?.ToString();
        var field = new FieldIdentifier(itemSeleccionado, fieldName);

        switch (fieldName)
        {

            case nameof(itemSeleccionado.numTrabajadores):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.numTrabajadores = int.Parse(value, CultureInfo.InvariantCulture);
                }
                else
                {

                    itemSeleccionado.numTrabajadores = 0;
                }

                break;

            case nameof(itemSeleccionado.HorasProduccionAnuales):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.HorasProduccionAnuales = double.Parse(value);
                }
                else
                {
                    itemSeleccionado.HorasProduccionAnuales = 0;
                }

                break;
            case nameof(itemSeleccionado.CosteMinimoPersonal):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.CosteMinimoPersonal = double.Parse(value);
                }
                else
                {
                    itemSeleccionado.CosteMinimoPersonal = 0;
                }

                break;
            case nameof(itemSeleccionado.CosteMaxPersonal):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.CosteMaxPersonal = double.Parse(value);
                }
                else
                {
                    itemSeleccionado.CosteMaxPersonal = 0;
                }

                break;
            case nameof(itemSeleccionado.CosteDirectoMedio):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.CosteDirectoMedio = double.Parse(value);
                }
                else
                {
                    itemSeleccionado.CosteDirectoMedio = 0;
                }

                break;
            case nameof(itemSeleccionado.CostesDirectos):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.CostesDirectos = double.Parse(value);
                }
                else
                {
                    itemSeleccionado.CostesDirectos = 0;
                }

                break;
            case nameof(itemSeleccionado.CostesIndirectos):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.CostesIndirectos = double.Parse(value);
                }
                else
                {
                    itemSeleccionado.CostesIndirectos = 0;
                }

                break;
            case nameof(itemSeleccionado.TotalDespachoProfesional):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.TotalDespachoProfesional = double.Parse(value);
                }
                else
                {
                    itemSeleccionado.TotalDespachoProfesional = 0;
                }

                break;
        }

        messageStore?.Clear(field);

        
        editContext?.NotifyValidationStateChanged();
    }

    private void ValidarTodo()
    {
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.numTrabajadores }, nameof(itemSeleccionado.numTrabajadores));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.HorasProduccionAnuales }, nameof(itemSeleccionado.HorasProduccionAnuales));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.CosteMinimoPersonal }, nameof(itemSeleccionado.CosteMinimoPersonal));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.CosteMaxPersonal }, nameof(itemSeleccionado.CosteMaxPersonal));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.CosteDirectoMedio }, nameof(itemSeleccionado.CosteDirectoMedio));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.CostesIndirectos }, nameof(itemSeleccionado.CostesIndirectos));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.CostesDirectos }, nameof(itemSeleccionado.CostesDirectos));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.TotalDespachoProfesional }, nameof(itemSeleccionado.TotalDespachoProfesional));
    }

    private string GetExternalValidationMessage(string fieldName)
    {
        var field = new FieldIdentifier(itemSeleccionado, fieldName);
        return messageStore?[field].FirstOrDefault() ?? string.Empty;
    }

    private async Task GestionarDatos(string accion)
    {

        var costeObtenido = bd.costedespachoprofesional.Where(x => x.idCosteDespachoProfesional == itemSeleccionado.idCosteDespachoProfesional).FirstOrDefault();

        switch (accion)
        {
            case "update":
                UtilidadesCASA.actualizarCosteDespachoProfesional(bd, costeObtenido, itemSeleccionado);

                await cerrarPopupGestionDatos();

                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Actualizado correctamente.",
                    });

                break;

            case "create":
                UtilidadesCASA.crearCosteDespachoProfesional(bd, itemSeleccionado);

                await cerrarPopupGestionDatos();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Guardado correctamente.",
                    });
                break;

            case "delete":
                UtilidadesCASA.eliminarCosteDespachoProfesional(bd, costeObtenido);

                await cerrarPopupConfirmarBorrado();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Eliminado correctamente.",
                    });
                break;
        }
        bd.SaveChanges();
        listadoCDCI = bd.costedespachoprofesional.OrderBy(x => x.numTrabajadores).ToList();
        await InvokeAsync(StateHasChanged);
    }


    private async Task BorrarItem()
    {
        await GestionarDatos("delete");
    }
    //////// PopUp eliminar registro
    private async Task abrirPopupConfirmarBorrado(costedespachoprofesional objeto)
    {
        itemSeleccionado = objeto;
        await popupConfirmarBorrado.ShowAsync();
    }
    private async Task cerrarPopupConfirmarBorrado()
    {
        await popupConfirmarBorrado.HideAsync();
    }

    // GUARDAR
    private async Task guardarFormulario()
    {
        try
        {
            ValidarTodo();

            if (!editContext!.GetValidationMessages().Any())
            {
                string accion = nuevoElemento ? "create" : "update";
                await GestionarDatos(accion);
            }
            else
            {
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Warning,
                        Message = $"Debe rellenar los campos obligatorios.",
                    });
            }

        }
        catch (Exception)
        {
            mensajes.Add(new ToastMessage
                {
                    Type = ToastType.Danger,
                    Message = $"Error al guardar.",
                });
        }

    }

    private void MostrarErrores()
    {
        messageStore?.Clear();
        foreach (var field in new[] { 
			nameof(itemSeleccionado.numTrabajadores),
			nameof(itemSeleccionado.HorasProduccionAnuales),
            nameof(itemSeleccionado.CosteMinimoPersonal),
			nameof(itemSeleccionado.CosteMaxPersonal),
            nameof(itemSeleccionado.CosteDirectoMedio),
			nameof(itemSeleccionado.CostesDirectos),
            nameof(itemSeleccionado.CostesIndirectos),
			nameof(itemSeleccionado.TotalDespachoProfesional)
        })
        {
            ValidarYActualizar(new ChangeEventArgs { Value = typeof(factorescorreccion).GetProperty(field)?.GetValue(itemSeleccionado) }, field);
        }
    }

} *@