@inject NavigationManager Navigation
@layout ConfiguracionLayout
@rendermode InteractiveServer

@using BlazorBootstrap
@using System.Globalization
@using Microsoft.EntityFrameworkCore
@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" FormName="docuForm">
    <DataAnnotationsValidator></DataAnnotationsValidator>
    <Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="false" UseStaticBackdrop="true" CloseOnEscape="false">
        <BodyTemplate>
            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Proyecto:</label>
                    <InputSelect @bind-Value="@idTipoProyecItem" class="inputForm">
                        @foreach (var grupoProyecto in listProyectos)
                        {
                            <option value="@grupoProyecto.idtipoproyectos">@grupoProyecto.Descripcion</option>
                        }
                    </InputSelect>
                </div>
            </div>


            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Documentación:</label>
                    <InputSelect @bind-Value="@idTipoDocItem" class="inputForm">
                        @foreach (var grupoProyecto in listDocu)
                        {
                            <option value="@grupoProyecto.iddocumentacion">@grupoProyecto.Descripcion</option>
                        }
                    </InputSelect>
                </div>
            </div>

            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Tipo Documentación:</label>

                    <div class="form-check" style="gap:50px;">
                        <div>
                            <input checked="@docuMinimItem" name="instrumentos" type="radio" id="1" class="form-check-input" value="@docuMinimItem" @onchange="() => Seleccionar(1)">
                            <label class="form-check-label" for="1">Mínima</label>
                        </div>

                        <div>
                            <input checked="@docuOpcionalItem" name="instrumentos" type="radio" id="2" class="form-check-input" value="@docuOpcionalItem" @onchange="() => Seleccionar(2)">
                            <label class="form-check-label" for="2">Opcional</label>
                        </div>

                        <div>
                            <input checked="@docuNecesaItem" name="instrumentos" type="radio" id="3" class="form-check-input" value="@docuNecesaItem" @onchange="() => Seleccionar(3)">
                            <label class="form-check-label" for="3">Necesaria</label>
                        </div>
                    </div>
                    </div>
            </div>

            <div class="row">
                <div class="col-4 formatoCampos pt-2">
                    <label class="tituloLbl">Orden:</label>
                    <InputNumber TValue="int" @bind-Value="ordenItem"
                                 step="any"
                                 class="inputForm text-end" />
                </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>

    <div class="row" style="justify-content:space-between">
        <div class="form-group mt-4 col-6">
            <input class="form-control" type="text" style="width: 400px;" placeholder="Filtrar..."
                   @bind-value="Filter" @bind-value:after="AplicarFiltros" />
        </div>

        <div class="d-flex justify-content-end mt-3 col-2">
            <button @onclick="@(() => abrirPopupGestionDatos(new v_tipoproyecto_documentacion(),true))" class="btnBlue d-flex align-items-center"> <i class="fas fa-plus-square pe-1"></i> Nueva documentación</button>
        </div>
    </div>


    <Grid TItem="v_tipoproyecto_documentacion"
          Class="tablaCACOA table"
          Data="listadoTipos_Docu"
          AllowFiltering="false"
          AllowPaging="true"
          PageSize="15"
          EmptyText="No hay registros."
          PageSizeSelectorVisible="false"
          PaginationItemsTextFormat="{0} - {1} de {2} elementos"
          Responsive="true">
        <GridColumns>
            <GridColumn TItem="v_tipoproyecto_documentacion" HeaderTextAlignment="Alignment.Center" HeaderText="Tipo Proyecto">
                    <span>@context.tipoproyecto</span>
            </GridColumn>

            <GridColumn TItem="v_tipoproyecto_documentacion" Class="columna30Ancho text-end" HeaderTextAlignment="Alignment.Center" HeaderText="Documentación">
                    <span>@context.documentacion</span>
            </GridColumn>

            <GridColumn TItem="v_tipoproyecto_documentacion" HeaderTextAlignment="Alignment.Center" Class="columna10Ancho text-center" HeaderText="Documentación mínima">
                @if (context.esMinima == true)
                {   
                    <span>
                        <Icon Name="IconName.Check"></Icon>
                    </span>
                }
            </GridColumn>

            <GridColumn TItem="v_tipoproyecto_documentacion" HeaderTextAlignment="Alignment.Center" Class="columna10Ancho text-center" HeaderText="Documentación opcional">
                @if (context.esOpcional == true)
                {
                    <span>
                        <Icon Name="IconName.Check"></Icon>
                    </span>
                }
            </GridColumn>

            <GridColumn TItem="v_tipoproyecto_documentacion" HeaderTextAlignment="Alignment.Center" Class="columna10Ancho text-center" HeaderText="Documentación necesaria">
                @if (context.esNecesario == true)
                {
                    <span>
                        <Icon Name="IconName.Check"></Icon>
                    </span>
                }
            </GridColumn>


            <GridColumn TItem="v_tipoproyecto_documentacion" HeaderTextAlignment="Alignment.Center" Class="columna10Ancho text-end" HeaderText="Orden">
                @context.orden
            </GridColumn>

            <GridColumn TItem="v_tipoproyecto_documentacion" 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>
</div>

@code {

    public List<v_tipoproyecto_documentacion> listadoTipos_Docu { get; set; } = new List<v_tipoproyecto_documentacion>();
    public List<v_tipoproyecto_documentacion> listadoTipos_DocuAux { get; set; } = new List<v_tipoproyecto_documentacion>();

    public List<tipoproyectos> listProyectos { get; set; } = new List<tipoproyectos>();
    public List<documentacion> listDocu { get; set; } = new List<documentacion>();

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

    private string tituloPopup = "";
    public string Filter { get; set; } = "";
    private Modal popupGestionDatos = default!;
    private Modal popupConfirmarBorrado = default!;

    private bool nuevoElemento;

    private int? idTipoProyecItem = 0;
    private int? idTipoDocItem = 0;
    private int ordenItem= 0;
    private bool? docuOpcionalItem = false;
    private bool? docuMinimItem = false;
    private bool? docuNecesaItem = false;

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

    private EditContext? editContext;
    private ValidationMessageStore? messageStore;
    public tsHerramientasCACOA bd;

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

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

        listadoTipos_Docu = bd.v_tipoproyecto_documentacion.ToList();
        listadoTipos_DocuAux = listadoTipos_Docu;

        listProyectos = bd.tipoproyectos.ToList();
        listDocu = bd.documentacion.ToList();
    }

    private async void Seleccionar(int item)
    {
        switch(item){
            case 1:
                docuMinimItem = true;
                docuNecesaItem = false;
                docuOpcionalItem = false;
                break;

            case 2:
                docuMinimItem = false;
                docuNecesaItem = false;
                docuOpcionalItem = true;
                break;


            case 3:
                docuMinimItem = false;
                docuNecesaItem = true;
                docuOpcionalItem = false;
                break;
        }
    }

    private void AplicarFiltros()
    {
        // Filtra la lista en función de los criterios ingresados
        listadoTipos_Docu = new List<bdHerramientaCACOA.db.v_tipoproyecto_documentacion>();
        foreach (bdHerramientaCACOA.db.v_tipoproyecto_documentacion item in listadoTipos_DocuAux)
        {
            if (IsVisible(item) == true)
            {
                listadoTipos_Docu.Add(item);
            }
        }
    }

    public bool IsVisible(bdHerramientaCACOA.db.v_tipoproyecto_documentacion listado)
    {
        if (string.IsNullOrEmpty(Filter))
        {
            return true;
        }

        if (listado.tipoproyecto.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase))
        {
            return true;
        }

        if (listado.documentacion.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase))
        {
            return true;
        }


        return false;
    }


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

        if (esNuevo)
        {
            nuevoElemento = true;

            idTipoProyecItem = 0;
            idTipoDocItem = 0;
            ordenItem = 0;
            docuOpcionalItem = false;
            docuMinimItem = false;
            docuNecesaItem = false;
        }
        else
        {
            nuevoElemento = false;

            idTipoProyecItem = objeto.idtipoproyecto;
            idTipoDocItem = objeto.iddocumentacion;
            ordenItem = objeto.orden;
            docuOpcionalItem = objeto.esOpcional;
            docuMinimItem = objeto.esMinima;
            docuNecesaItem = objeto.esNecesario;
        }

        if (!nuevoElemento)
        {
            tituloPopup = "Modificar documentanción";
        }
        else
        {
            idTipoProyecItem = listProyectos.First().idtipoproyectos;
            idTipoDocItem = listDocu.First().iddocumentacion;

            docuMinimItem = true;

            tituloPopup = "Añadir documentanción";
        }

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


    private async Task GestionarDatos(string accion)
    {
        var docuObtenida = bd.tipoproyecto_documentacion.Where(x => x.idtipoproyecto_documentacion == itemSeleccionado.idtipoproyecto_documentacion).FirstOrDefault();

        itemSeleccionado.idtipoproyecto = idTipoProyecItem;
        itemSeleccionado.iddocumentacion = idTipoDocItem;
        itemSeleccionado.orden = ordenItem;
        itemSeleccionado.esOpcional = docuOpcionalItem;
        itemSeleccionado.esMinima = docuMinimItem;
        itemSeleccionado.esNecesario = docuNecesaItem;

        switch (accion)
        {
            case "update":
                UtilidadesCASA.actualizarProyecto_Documentacion(bd, docuObtenida, itemSeleccionado);

                await cerrarPopupGestionDatos();

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

                break;

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

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

            case "delete":
                UtilidadesCASA.eliminarProyecto_Documentacion(bd, docuObtenida);

                await cerrarPopupConfirmarBorrado();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Eliminado correctamente.",
                    });
                break;
        }
        bd.SaveChanges();
        listadoTipos_Docu = bd.v_tipoproyecto_documentacion.ToList();
        listadoTipos_DocuAux = listadoTipos_Docu;
        await InvokeAsync(StateHasChanged);
    }

    private async void opcionalCambiado(bool e)
    {
        docuMinimItem= e;
    }


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

    // GUARDAR
    private async Task guardarFormulario()
    {
        try
        {
                string accion = nuevoElemento ? "create" : "update";
                await GestionarDatos(accion);
        }
        catch (Exception)
        {
            mensajes.Add(new ToastMessage
                {
                    Type = ToastType.Danger,
                    Message = $"Error al guardar.",
                });
        }

    }
}