package mx.gob.jumapacelaya.Services;

import mx.gob.jumapacelaya.models.Usuario;
import mx.gob.jumapacelaya.views.CuestionarioView;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import com.vaadin.flow.component.html.Paragraph;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.notification.NotificationVariant;
import com.vaadin.flow.component.orderedlayout.FlexComponent.Alignment;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.LocalDate;

@Service
public class GuardarSolicitudService {

    private final JdbcTemplate jdbcTemplate;
    private static final Logger logger = LoggerFactory.getLogger(GuardarSolicitudService.class);

    public GuardarSolicitudService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public boolean guardarSolicitud(
            Integer pPredioID,
            String pTiposolicitud,
            String pNombreSolicitante,
            String pParentesco,
            String pTipoIdentificacion,
            String pNumIdentificacion,
            String pUsuarioId,
            String pFirma,
            String pEmail,
            String pVigencia,
            String pEstado,
            String pDetDesc,
            String pFirmaUsuario,
            String pDetCalif
    ) 
    {

        String procedureCall = "{call pk_soldigitales.sp_inssoldig("+pPredioID+", '"+pTiposolicitud+"', sysdate, sysdate, \r\n" + //
                        "'"+pNombreSolicitante+"', '"+pParentesco+"', '"+pTipoIdentificacion+"', substr('"+pNumIdentificacion+"', 1, 40), '"+pFirma+"', \r\n" + //
                        "'"+pUsuarioId+"', '"+pEmail+"', to_date('31/12/'|| extract (year from sysdate) || ' 23:59:59', 'dd/mm/yyyy hh24:mi:ss'),\r\n" + //
                        "'"+pEstado+"', "+pDetDesc+", \r\n" + //
                        "'"+pFirmaUsuario+"', \r\n" + //
                        pDetCalif+"}";

        logger.info(procedureCall);

        jdbcTemplate.execute((Connection connection) -> {
        try (CallableStatement callableStatement = connection.prepareCall(procedureCall)) {
            // Asignar los parámetros de manera correcta

            /*
            logger.info("p_Predio: "+pPredioID);
            logger.info("p_Detdesc: "+pDetDesc);
            callableStatement.setLong("p_Predio", pPredioID); // ID del predio
            callableStatement.setString("p_Tipo", pTiposolicitud); // Tipo de solicitud
            callableStatement.setString("p_Solicitante", pNombreSolicitante); // Solicitante
            callableStatement.setString("p_Detdesc", pDetDesc); // Detalles de descuento
            */
            
            /*
            callableStatement.setLong(1, predioId); // ID del predio
            callableStatement.setString(2, tipoSolicitud); // Tipo de solicitud
            callableStatement.setString(3, nombreSolicitante); // Solicitante
            callableStatement.setString(4, parentesco); // Parentesco
            callableStatement.setString(5, tipoIdentificacion); // Tipo de identificación
            callableStatement.setString(6, numIdentificacion); // Número de identificación
            callableStatement.setString(7, firma); // Firma digital
            callableStatement.setString(8, usuarioId); // Usuario ID
            callableStatement.setString(9, email); // Correo electrónico
            callableStatement.setString(10, "31/12/" + LocalDate.now().getYear() + " 23:59:59"); // Fecha de vigencia
            callableStatement.setString(11, estado); // Estado
            callableStatement.setString(12, detdesc); // Detalles de descuento
            callableStatement.setString(13, detCalif); // Detalles de cálculos // Detalles de cálculos
            */

            callableStatement.execute();
            notifiSuccess("Solicitud guardada correctamente..");
            return true;

        } catch (SQLException e) {
            //e.printStackTrace();
            notifiError("Error al Guardar:"+e.getMessage());
            return false;
        }
        catch (Exception e) {
            //e.printStackTrace();
            notifiError("Error al Guardar:"+e.getMessage());
            return false;
        }
    });

    return false;
    }

    private void notifiError(String message) {
        Notification notification = new Notification();
        notification.setPosition(Notification.Position.TOP_CENTER);
        notification.addThemeVariants(NotificationVariant.LUMO_ERROR);
        notification.setDuration(3000);

        Icon warningIcon = new Icon(VaadinIcon.CLOSE_CIRCLE_O);
        warningIcon.setSize("48px");
        warningIcon.getStyle().set("margin-bottom", "10px");


        Paragraph messajeTexto = new Paragraph(message);
        messajeTexto.getStyle().set("margin", "0").set("text-align", "center");


        HorizontalLayout buttonsLayout = new HorizontalLayout(warningIcon, messajeTexto);
        buttonsLayout.setAlignItems(Alignment.CENTER);
        buttonsLayout.setSpacing(false);
        buttonsLayout.setPadding(false);
        buttonsLayout.setWidthFull();

        HorizontalLayout wrapper = new HorizontalLayout(buttonsLayout);
        wrapper.setPadding(true);
        wrapper.setSpacing(false);
        wrapper.getStyle().set("position", "relative");
        wrapper.getStyle().set("padding", "10px");
        wrapper.setWidth("100%");

        notification.add(wrapper);
        notification.open();
    }

    private void notifiSuccess(String message) {
        Notification notification = new Notification();
        notification.setPosition(Notification.Position.TOP_CENTER);
        notification.addThemeVariants(NotificationVariant.LUMO_SUCCESS);
        notification.setDuration(3000);

        Icon warningIcon = new Icon(VaadinIcon.CHECK_CIRCLE_O);
        warningIcon.setSize("48px");
        warningIcon.getStyle().set("margin-bottom", "10px");


        Paragraph messajeTexto = new Paragraph(message);
        messajeTexto.getStyle().set("margin", "0").set("text-align", "center");


        HorizontalLayout buttonsLayout = new HorizontalLayout(warningIcon, messajeTexto);
        buttonsLayout.setAlignItems(Alignment.CENTER);
        buttonsLayout.setSpacing(false);
        buttonsLayout.setPadding(false);
        buttonsLayout.setWidthFull();

        HorizontalLayout wrapper = new HorizontalLayout(buttonsLayout);
        wrapper.setPadding(true);
        wrapper.setSpacing(false);
        wrapper.getStyle().set("position", "relative");
        wrapper.getStyle().set("padding", "10px");
        wrapper.setWidth("100%");

        notification.add(wrapper);
        notification.open();
    }
}
