@using System.Globalization
<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="tiposForm">
    <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">Superficie:</label>
                    <InputNumber TValue="double" @bind-Value="itemSeleccionadoTemporal.superficie"
                                 step="any"
                                 @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionadoTemporal.superficie))"
                                 class="inputForm" />

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

            <div class="col-12 formatoCampos pt-2">
                <label class="tituloLbl">Uso:</label>
                <InputSelect @bind-Value="@itemSeleccionadoTemporal.idGrupoTipologia" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionadoTemporal.idGrupoTipologia))">
                    @foreach (var grupoTipologia in objetoCASA.Enumerados.GruposTipologias)
                    {
                        <option value="@grupoTipologia.idEnumeracion">@grupoTipologia.ValorAlfabetico1</option>
                    }
                </InputSelect>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.idGrupoTipologia))</div>
            </div>

            <div class="col-12 formatoCampos pt-2">
                <label class="tituloLbl">Tipología:</label>
                <InputSelect @bind-Value="@itemSeleccionadoTemporal.idTipologia" class="inputForm">
                    @foreach (var tipologia in tipologiasAux)
                    {
                        <option value="@tipologia.idTipologia">@tipologia.Descripcion</option>
                    }
                </InputSelect>
            </div>

            <div class="col-12 formatoCampos pt2">
                <label class="tituloLbl">Intervención:</label>
                <InputSelect @bind-Value="@itemSeleccionadoTemporal.idTipoIntervencion" class="inputForm">
                    @foreach (var intervencion in intervencionesAux)
                    {
                        <option value="@intervencion.idEnumeracion">@intervencion.ValorAlfabetico1</option>
                    }
                </InputSelect>
            </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="d-flex justify-content-between">
    <div><b>Usos/Tipología</b></div>
</div>

<div style="position:relative;margin-bottom: 15px;">

    <Grid TItem="CASA.UsosTipologia"
          Class="tablaCACOA table"
          Data="UsosTipologias"
          AllowFiltering="false"
          AllowRowClick="true"
          OnRowClick="OnRowClick"
          EmptyText="No hay registros."
          Height="100"
          Style="table-layout:fixed !important"
          PageSizeSelectorVisible="false"
          Responsive="true">

        <GridColumns>
            <GridColumn Class="columna20Ancho text-end" HeaderTextAlignment="Alignment.Center" TItem="CASA.UsosTipologia" HeaderText="Superficie">
                <span>
                    @context.superficie.MilesYDecimales()
                </span>
            </GridColumn>

            <GridColumn Class="columna20Ancho" HeaderTextAlignment="Alignment.Center" TItem="CASA.UsosTipologia" HeaderText="Uso">
                @objetoCASA.Enumerados.GruposTipologias?.FirstOrDefault(x => x.idEnumeracion == context.idGrupoTipologia)?.ValorAlfabetico1
            </GridColumn>

            <GridColumn TItem="CASA.UsosTipologia" HeaderTextAlignment="Alignment.Center" HeaderText="Tipología">
                @objetoCASA.Enumerados.Tipologias?.FirstOrDefault(x => x.idTipologia == context.idTipologia)?.Descripcion
            </GridColumn>

            <GridColumn Class="columna20Ancho" HeaderTextAlignment="Alignment.Center" TItem="CASA.UsosTipologia" HeaderText="Intervención">
                @objetoCASA.Enumerados.Intervenciones?.FirstOrDefault(x => x.idEnumeracion == context.idTipoIntervencion)?.ValorAlfabetico1
            </GridColumn>

            <GridColumn TItem="CASA.UsosTipologia" Class="botonesTabla" HeaderText="">
                <div class="btnTablasEspaciado">
                    <span @onclick="@(() => abrirPopupGestionDatos(@context,false))" class="btnBorrarGuardar">
                        <Icon CustomIconName="fas fa-edit"></Icon>
                    </span>
                    <span @onclick="@(() => abrirPopupConfirmarBorrado(@context))" class="btnBorrarGuardar">
                        <Icon CustomIconName="fas fa-trash"></Icon>
                    </span>
</div>
               
            </GridColumn>
        </GridColumns>
    </Grid>

    <table class="table tablaCACOA mb-0" style="position:absolute;bottom:-33px;">
        <tfoot>
            <tr>
                <td colspan="2" class="text-end fw-bold colorC TotalesTabla">

                    <div class="d-flex justify-content-between">
                        <div class="mt-1">
                            <button @onclick="@(() => abrirPopupGestionDatos(new CASA.UsosTipologia(),true))" class="btnBlue d-flex align-items-center"> <i class="fas fa-plus-square pe-1"></i> Añadir nuevo Uso</button>
                        </div>
                        <div style="align-self: center;">
                            Total superficie: <span>
                                @UsosTipologias.Sum(x => x.superficie).MilesYDecimales()
                            </span>
                        </div>
                    </div>
                </td>
            </tr>
        </tfoot>
    </table>
</div>

@code {
    [CascadingParameter]
    public TrabajoProfesional _Parent { get; set; }
    [Parameter]
    public CASA objetoCASA { get; set; } = new CASA();

    public List<CASA.UsosTipologia> UsosTipologias { get; set; } = new List<CASA.UsosTipologia>();
    private List<CASA.tipologiasCASA> tipologiasAux = new List<CASA.tipologiasCASA>();
    private List<CASA.enumeracionesCASA> intervencionesAux = new List<CASA.enumeracionesCASA>();


    [SupplyParameterFromForm]
    private CASA.UsosTipologia itemSeleccionado { get; set; } = new CASA.UsosTipologia();

    private CASA.UsosTipologia itemSeleccionadoTemporal { get; set; } = new CASA.UsosTipologia();

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

    private bool nuevoElemento;
    private ValidationMessageStore? messageStore;

    private EditContext editContext;


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


    protected override async Task OnInitializedAsync()
    {
        editContext = new EditContext(itemSeleccionado);
        messageStore = new ValidationMessageStore(editContext);

        UsosTipologias = objetoCASA.TrabajoProfesional.Usos.ToList();
        //tipologiasAux = objetoCASA.Enumerados.Tipologias.ToList();
    }

    private async Task GestionarDatos(string accion)
    {
        try{
            rellenarItem();
            switch (accion)
            {
                case "update":
                    objetoCASA.ActualizarUso(itemSeleccionado);

                    await cerrarPopupGestionDatos();

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

                    break;

                case "create":
                    objetoCASA.InsertarUso(itemSeleccionado);
                    await cerrarPopupGestionDatos();
                    mensajes.Add(new ToastMessage
                        {
                            Type = ToastType.Primary,
                            Message = $"Guardado correctamente.",
                        });
                    break;

                case "delete":
                    objetoCASA.EliminarUso(itemSeleccionado);



                    await cerrarPopupConfirmarBorrado();
                    mensajes.Add(new ToastMessage
                        {
                            Type = ToastType.Primary,
                            Message = $"Eliminado correctamente.",
                        });
                    break;
            }
            UsosTipologias = objetoCASA.TrabajoProfesional.Usos.ToList();
            await InvokeAsync(StateHasChanged);
            _Parent.RefreshState();
        }
        catch (Exception ex)
        {
            var a = ex;
        }

    }
    private async Task BorrarItem()
    {
        await GestionarDatos("delete");
    }


    private async Task abrirPopupGestionDatos(CASA.UsosTipologia objeto, bool esNuevo)
    {
        itemSeleccionado = objeto;

        if (esNuevo)
        {
            itemSeleccionadoTemporal = new CASA.UsosTipologia();

            nuevoElemento = true;
        }
        else
        {
      

            itemSeleccionadoTemporal = new CASA.UsosTipologia()
                {
                    CoefIntervencion = objeto.CoefIntervencion,
                    CoefTipologia = objeto.CoefTipologia,
                    idGrupoTipologia = objeto.idGrupoTipologia,
                    idTipoIntervencion = objeto.idTipoIntervencion,
                    idTipologia = objeto.idTipologia,
                    superficie = objeto.superficie,
                    SuperficieCoefIntervencion = objeto.SuperficieCoefIntervencion,
                    SuperficieCoefTipologia = objeto.SuperficieCoefTipologia
                };

            await cambiarTipologia();
            nuevoElemento = false;
        }

        if (!nuevoElemento)
        {
            tituloPopup = "Modificar uso";
        }
        else
        {
            tituloPopup = "Nuevo uso";
        }
        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }

    private async Task cambiarTipologia()
    {
        tipologiasAux = objetoCASA.Enumerados.TipologiasPorGrupo(itemSeleccionadoTemporal.idGrupoTipologia).ToList();


        if (itemSeleccionadoTemporal.idTipologia == 0)
        {
            itemSeleccionadoTemporal.idTipologia = tipologiasAux.First().idTipologia;
        }
        else
        {
            if (tipologiasAux.Any(x => x.idTipologia == itemSeleccionadoTemporal.idTipologia))
            {
                itemSeleccionadoTemporal.idTipologia = itemSeleccionadoTemporal.idTipologia;
            }
            else
            {
                itemSeleccionadoTemporal.idTipologia = tipologiasAux.First().idTipologia;
            }
        }

        intervencionesAux = objetoCASA.Enumerados.Intervenciones.ToList();
        itemSeleccionadoTemporal.idTipoIntervencion = itemSeleccionadoTemporal.idTipoIntervencion == 0 ? intervencionesAux.First().idEnumeracion : itemSeleccionadoTemporal.idTipoIntervencion;

        await InvokeAsync(StateHasChanged);
    }



    //////// PopUp eliminar registro
    private async Task abrirPopupConfirmarBorrado(CASA.UsosTipologia objeto)
    {
        itemSeleccionadoTemporal = objeto;
        await popupConfirmarBorrado.ShowAsync();
    }
    private async Task cerrarPopupConfirmarBorrado()
    {
        await popupConfirmarBorrado.HideAsync();
    }

    private async Task OnRowClick(GridRowEventArgs<CASA.UsosTipologia> objeto)
    {
        itemSeleccionado = objeto.Item;
    }

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

        switch (fieldName)
        {
            case nameof(itemSeleccionadoTemporal.superficie):

                if (!string.IsNullOrEmpty(value))
                {
                    string parseado = value.Replace(",", ".");
                    itemSeleccionadoTemporal.superficie = double.Parse(parseado, CultureInfo.InvariantCulture);
                }

                break;
            case nameof(itemSeleccionadoTemporal.idGrupoTipologia):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionadoTemporal.idGrupoTipologia = int.Parse(value);
                    cambiarTipologia();
                }
                else
                {
                    itemSeleccionadoTemporal.idGrupoTipologia = 0;
                }

                break;
        }

        messageStore?.Clear(field);
        if (fieldName == nameof(itemSeleccionadoTemporal.superficie) && itemSeleccionadoTemporal.superficie <= 0)
        {
            messageStore?.Add(field, "La superficie debe ser mayor que 0.");
        }

        if (fieldName == nameof(itemSeleccionadoTemporal.idGrupoTipologia) && itemSeleccionadoTemporal.idGrupoTipologia == 0)
        {
            messageStore?.Add(field, "Seleccione un tipo de uso.");
        }

        editContext?.NotifyValidationStateChanged();
    }

    private void ValidarTodo()
    {
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.superficie }, nameof(itemSeleccionadoTemporal.superficie));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.idGrupoTipologia }, nameof(itemSeleccionadoTemporal.idGrupoTipologia));
    }

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


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

            if (!editContext!.GetValidationMessages().Any())
            {
                string accion = nuevoElemento ? "create" : "update";
                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.superficie), nameof(itemSeleccionado.idGrupoTipologia) })
        {
            ValidarYActualizar(new ChangeEventArgs { Value = typeof(CASA.UsosTipologia).GetProperty(field)?.GetValue(itemSeleccionado) }, field);
        }
    }



    private void rellenarItem()
    {
        itemSeleccionado.CoefIntervencion = itemSeleccionadoTemporal.CoefIntervencion;
        itemSeleccionado.CoefTipologia = itemSeleccionadoTemporal.CoefTipologia;
        itemSeleccionado.idGrupoTipologia = itemSeleccionadoTemporal.idGrupoTipologia;
        itemSeleccionado.idTipoIntervencion = itemSeleccionadoTemporal.idTipoIntervencion;
        itemSeleccionado.idTipologia = itemSeleccionadoTemporal.idTipologia;
        itemSeleccionado.superficie = itemSeleccionadoTemporal.superficie;
        itemSeleccionado.SuperficieCoefIntervencion = itemSeleccionadoTemporal.SuperficieCoefIntervencion;
        itemSeleccionado.SuperficieCoefTipologia = itemSeleccionadoTemporal.SuperficieCoefTipologia;
    }
}
