package org.example.saladeconciertos;

import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.scene.control.ButtonType;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class EscogerEvento {
    // Datos de conexión a la base de datos
    private static final String DB_URL = "jdbc:mysql://sql10.freesqldatabase.com:3306/sql10766655";
    private static final String DB_USER = "sql10766655";
    private static final String DB_PASSWORD = "7BZbRjEkXZ";

    // Método para mostrar la ventana de selección de eventos
    public void mostrarVentanaSeleccionEvento(Stage mainStage, VentaBoletos ventaBoletos) {
        // Crear y configurar el label para seleccionar un evento
        Label selectEventLabel = new Label("Seleccione un evento:");
        selectEventLabel.getStyleClass().add("label");

        // Crear y configurar el ComboBox para listar los eventos
        ComboBox<String> eventComboBox = new ComboBox<>();

        // Crear y configurar el label para mostrar el evento seleccionado
        Label selectedEventLabel = new Label("Evento seleccionado: Ninguno");
        selectedEventLabel.getStyleClass().add("label");

        // Crear y configurar el botón de confirmación
        Button confirmButton = new Button("Confirmar");
        confirmButton.getStyleClass().add("button");

        // Crear y configurar el botón de generar reporte
        Button reportButton = new Button("Generar Reporte");
        reportButton.getStyleClass().add("button");

        // Cargar eventos desde la base de datos
        try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
            String query = "SELECT id, nombre FROM conciertos";
            Statement statement = conexion.createStatement();
            ResultSet resultSet = statement.executeQuery(query);

            // Añadir los eventos al ComboBox
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String nombre = resultSet.getString("nombre");
                eventComboBox.getItems().add(id + " - " + nombre);
            }
        } catch (SQLException e) {
            System.out.println("Error al cargar los eventos.");
            e.printStackTrace();
        }

        // Actualizar el label cuando se selecciona un evento
        eventComboBox.setOnAction(e -> {
            String selectedEvent = eventComboBox.getValue();
            if (selectedEvent != null) {
                selectedEventLabel.setText("Evento seleccionado: " + selectedEvent);
            }
        });

        // Acción del botón de confirmación
        confirmButton.setOnAction(e -> {
            String selectedEvent = eventComboBox.getValue();
            if (selectedEvent != null) {
                int eventId = Integer.parseInt(selectedEvent.split(" - ")[0]);
                ventaBoletos.setEventId(eventId);
                ventaBoletos.cargarInformacionEvento();
                ventaBoletos.mostrarVentanaVentaBoletos(mainStage);
            } else {
                ventaBoletos.mostrarAlerta("Advertencia", "No se ha seleccionado un evento", "Por favor, seleccione un evento.");
            }
        });

        // Acción del botón de generar reporte
        reportButton.setOnAction(e -> {
            String selectedEvent = eventComboBox.getValue();
            if (selectedEvent != null) {
                int eventId = Integer.parseInt(selectedEvent.split(" - ")[0]);
                generarReporte(eventId, selectedEvent.split(" - ")[1]);
            } else {
                ventaBoletos.mostrarAlerta("Advertencia", "No se ha seleccionado un evento", "Por favor, seleccione un evento.");
            }
        });

        // Agregar el logo de la aplicación
        ImageView logo = new ImageView(new Image(getClass().getResourceAsStream("/logo.png")));
        logo.setFitWidth(100);
        logo.setFitHeight(100);

        // Crear y configurar el layout principal
        VBox layout = new VBox(20, logo, selectEventLabel, eventComboBox, selectedEventLabel, confirmButton, reportButton);
        layout.setAlignment(Pos.CENTER);
        layout.setPadding(new Insets(20));

        // Crear y configurar la escena
        Scene scene = new Scene(layout, 400, 400);
        scene.getStylesheets().add(getClass().getResource("/styles.css").toExternalForm());
        mainStage.setScene(scene);
        mainStage.show();
    }

    // Método para convertir IDs de asientos a nombres de asientos
    private String convertirIdAsientoANombre(int seatId) {
        int fila = (seatId - 1) / 5;
        int numero = (seatId - 1) % 5 + 1;
        char filaLetra = (char) ('A' + fila);
        return filaLetra + String.valueOf(numero);
    }

    // Método para generar el reporte de boletos vendidos
    private void generarReporte(int eventId, String eventName) {
        List<String> seatDetails = new ArrayList<>();
        StringBuilder reportContent = new StringBuilder();
        reportContent.append("Reporte de Boletos Vendidos\n");

        // Obtener la fecha del evento
        String eventDate = "";
        try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
            String eventQuery = "SELECT fecha FROM conciertos WHERE id = ?";
            PreparedStatement eventStatement = conexion.prepareStatement(eventQuery);
            eventStatement.setInt(1, eventId);
            ResultSet eventResultSet = eventStatement.executeQuery();
            if (eventResultSet.next()) {
                eventDate = eventResultSet.getDate("fecha").toString();
            }
        } catch (SQLException e) {
            System.out.println("Error al obtener la fecha del evento.");
            e.printStackTrace();
        }

        reportContent.append("Evento: ").append(eventName).append(" - Fecha: ").append(eventDate).append("\n\n");

        try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
            String query = "SELECT a.id, a.precio_base, b.fechaVenta FROM asientos a JOIN boleto b ON a.id = b.id_asiento WHERE b.idevento = ? AND b.status = 'vendido'";
            PreparedStatement statement = conexion.prepareStatement(query);
            statement.setInt(1, eventId);
            ResultSet resultSet = statement.executeQuery();

            while (resultSet.next()) {
                int seatId = resultSet.getInt("id");
                double price = resultSet.getDouble("precio_base");
                Date saleDate = resultSet.getDate("fechaVenta");
                String seatName = convertirIdAsientoANombre(seatId);
                String seatDetail = "Asiento: " + seatName + ", Precio: $" + price + ", Fecha de Venta: " + saleDate;
                seatDetails.add(seatDetail);
                reportContent.append(seatDetail).append("\n");
            }
        } catch (SQLException e) {
            System.out.println("Error al generar el reporte.");
            e.printStackTrace();
        }

        // Mostrar el reporte en una alerta
        mostrarAlertaConBotonPDF("Reporte de Boletos Vendidos", "Detalles del Reporte", reportContent.toString(), eventName, seatDetails);
    }

    // Método para mostrar una alerta con un botón para generar PDF
    private void mostrarAlertaConBotonPDF(String titulo, String encabezado, String contenido, String eventName, List<String> seatDetails) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle(titulo);
        alert.setHeaderText(encabezado);
        alert.setContentText(contenido);

        ButtonType buttonTypePDF = new ButtonType("Generar PDF");
        alert.getButtonTypes().add(buttonTypePDF);

        alert.showAndWait().ifPresent(response -> {
            if (response == buttonTypePDF) {
                // Generar el PDF del reporte usando la clase PDFGenerator
                InputStream qrImageStream = getClass().getResourceAsStream("/qrcode.png"); // Cambia esto por la ruta de tu imagen QR
                String timestamp = new java.text.SimpleDateFormat("yyyy-MM-dd HH_mm").format(new java.util.Date());
                String pdfFileName = "Reporte_"+eventName.replace(" ", "_")+"_" + timestamp + ".pdf";
                PDFGenerator.generarPDF(eventName, "", "", 0.0, qrImageStream, String.join("\n", seatDetails), pdfFileName);
            }
        });
    }

    // Método para mostrar una alerta
    private void mostrarAlerta(String titulo, String encabezado, String contenido) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle(titulo);
        alert.setHeaderText(encabezado);
        alert.setContentText(contenido);
        alert.showAndWait();
    }
}