@using BlazorBootstrap

<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="costesPersonalForm">
    <DataAnnotationsValidator></DataAnnotationsValidator>
<Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <div class="row">
            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Denominación grupo:</label>
                <InputText @bind-Value="itemSeleccionado.DenominacionGrupo" class="inputForm"></InputText>

            </div>
            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Categoría Profesional:</label>
                    <InputSelect @bind-Value="@itemSeleccionado.idCategoriaProfesional" @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.idCategoriaProfesional))" class="inputForm">
                    @foreach (var puesTrab in objetoCASA.Enumerados.ListaPuestosTrabajo)
                    {
                        <option value="@puesTrab.idEnumeracion">@puesTrab.ValorAlfabetico1</option>
                    }
                </InputSelect>
                    <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.idCategoriaProfesional))</div>
            </div>
            <div class="col-6 formatoCampos">
                <label class="tituloLbl">Complementos:</label>
                <NumberInput TValue="double" Min="0" @bind-Value="itemSeleccionado.Complementos" class="inputForm"></NumberInput>
            </div>
            <div class="col-6 formatoCampos">
                <label class="tituloLbl">Nº Pagas Año:</label>
                <NumberInput TValue="double" Min="0" @bind-Value="itemSeleccionado.numPagasAnuales" class="inputForm"></NumberInput>
            </div>
            <div class="col-6 formatoCampos">
                <label class="tituloLbl">Jornada Laboral (Hor/Sem):</label>
                <NumberInput TValue="int" Min="0" @bind-Value="itemSeleccionado.HorasJornadaLaboral" class="inputForm"></NumberInput>
            </div>
            <div class="col-6 formatoCampos">
                <label class="tituloLbl">% Producción (Costes Directos):</label>
                <NumberInput TValue="double" Min="0" @bind-Value="itemSeleccionado.PorcentajeProduccion" class="inputForm"></NumberInput>
            </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="d-flex justify-content-between mt-3">
    <div><b>Calcular Costes de Personal del Despacho Profesional</b></div>
    <button @onclick="@(() => abrirPopupGestionDatos(new CASA.GrupoTrabajador(), true))" class="btnBlue d-flex align-items-center"> <i class="fas fa-plus-square pe-1"></i>Nuevo Grupo de Trabajador</button>
</div>

<Grid TItem="CASA.GrupoTrabajador"
      Class="tablaCACOA table"
      Data="GrupoTrab"
      AllowFiltering="false"
      PageSize="10"
      Height="100"
      EmptyText="No hay registros."
      PageSizeSelectorVisible="false"
      Responsive="true">

    <GridColumns>
        <GridColumn TItem="CASA.GrupoTrabajador" HeaderText="Denominación del grupo" PropertyName="DenominacionGrupo" Class="colorA">
            @context.DenominacionGrupo
        </GridColumn>
        <GridColumn TItem="CASA.GrupoTrabajador" HeaderText="Categoria Profesional" PropertyName="idCategoriaProfesional">
            @objetoCASA.Enumerados.ListaPuestosTrabajo?.FirstOrDefault(x => x.idEnumeracion == context.idCategoriaProfesional)?.ValorAlfabetico1
        </GridColumn>
        <GridColumn TItem="CASA.GrupoTrabajador" HeaderText="Total devengado" PropertyName="TotalDevengado">
            @context.TotalDevengado
        </GridColumn>
        <GridColumn TItem="CASA.GrupoTrabajador" HeaderText="Nº de trabajadores" PropertyName="Complementos">
            @context.Complementos
        </GridColumn>
        <GridColumn TItem="CASA.GrupoTrabajador" HeaderText="Seg. Social" PropertyName="segSocialEmpresa">
            @context.segSocialEmpresa
        </GridColumn>
        <GridColumn TItem="CASA.GrupoTrabajador" HeaderText="Nº Pagas Año" PropertyName="numPagasAnuales">
            @context.numPagasAnuales
        </GridColumn>
        <GridColumn TItem="CASA.GrupoTrabajador" HeaderText="Jornada Laboral (Hor/Sem)" PropertyName="HorasJornadaLaboral">
            @context.HorasJornadaLaboral
        </GridColumn>
        <GridColumn TItem="CASA.GrupoTrabajador" HeaderText="Coste Anual Individual (Incl. Seg Social)" PropertyName="CosteAnualIndividual">
            @context.CosteAnualIndividual
        </GridColumn>
        <GridColumn TItem="CASA.GrupoTrabajador" HeaderText="Horas/Año" PropertyName="HorasAnuales">
            @context.HorasAnuales
        </GridColumn>
        <GridColumn TItem="CASA.GrupoTrabajador" HeaderText="% Producción" PropertyName="PorcentajeProduccion">
            @context.PorcentajeProduccion
        </GridColumn>
        <GridColumn TItem="CASA.GrupoTrabajador" HeaderText="% Administración" PropertyName="PorcentajeAdministración">
            @context.PorcentajeAdministración
        </GridColumn>
        <GridColumn TItem="CASA.GrupoTrabajador" HeaderText="Horas Producción" PropertyName="HorasProduccion">
            @context.HorasProduccion
        </GridColumn>
        <GridColumn TItem="CASA.GrupoTrabajador" 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>

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

	public List<CASA.GrupoTrabajador> GrupoTrab { get; set; } = new List<CASA.GrupoTrabajador>();
    private CASA.GrupoTrabajador itemSeleccionado = new CASA.GrupoTrabajador();
	private bool nuevoElemento;

	private string tituloPopup = "";
	private Modal popupGestionDatos = default!;
	private Modal popupConfirmarBorrado = default!;
	List<ToastMessage> mensajes = new List<ToastMessage>();

    private EditContext? editContext;
    private ValidationMessageStore? messageStore;

	protected override async Task OnInitializedAsync()
	{
        editContext = new EditContext(itemSeleccionado);
        messageStore = new ValidationMessageStore(editContext);
		GrupoTrab = objetoCASA.DespachoProfesional.CostesPersonal.GrupoTrabajadores;
	}

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

                await cerrarPopupGestionDatos();

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

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

            case "delete":
                objetoCASA.EliminarGrupoTrabajo(itemSeleccionado);
                await cerrarPopupConfirmarBorrado();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Eliminado correctamente.",
                    });
                break;
        }
        GrupoTrab = objetoCASA.DespachoProfesional.CostesPersonal.GrupoTrabajadores.ToList();
        await InvokeAsync(StateHasChanged);
    }
    private async Task BorrarItem()
    {
        await GestionarDatos("delete");
    }


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

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

        if (!nuevoElemento)
        {
            tituloPopup = "Modificar Grupo";
        }
        else
        {
            tituloPopup = "Nuevo Grupo";
            objeto.DenominacionGrupo = "Arquitecto";
            objeto.numPagasAnuales = 14;
            objeto.HorasJornadaLaboral = 40;
            objeto.PorcentajeProduccion = 80;
        }
        StateHasChanged();
        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }

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

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

        switch (fieldName)
        {
            case nameof(itemSeleccionado.idCategoriaProfesional):
                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.idCategoriaProfesional = int.Parse(value);
                }
                else
                {
                    itemSeleccionado.idCategoriaProfesional = 0;
                }
                break;
        }

        messageStore?.Clear(field);

        if (fieldName == nameof(itemSeleccionado.idCategoriaProfesional) && itemSeleccionado.idCategoriaProfesional == null || itemSeleccionado.idCategoriaProfesional == 0)
        {
            messageStore?.Add(field, "Seleccione una categoría.");
        }

        editContext?.NotifyValidationStateChanged();
    }

    private void ValidarTodo()
    {
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.idCategoriaProfesional }, nameof(itemSeleccionado.idCategoriaProfesional));
    }

    private string GetExternalValidationMessage(string fieldName)
    {
        var field = new FieldIdentifier(itemSeleccionado, 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.idCategoriaProfesional)})
        {
            ValidarYActualizar(new ChangeEventArgs { Value = typeof(CASA.UsosTipologia).GetProperty(field)?.GetValue(itemSeleccionado) }, field);
        }
    }
}
