package org.example.saladeconciertos; import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.Alert; // Nuevo: Importación para usar Alert import javafx.scene.image.Image; // Nuevo: Importación para usar Image import javafx.scene.image.ImageView; // Nuevo: Importación para usar ImageView import javafx.scene.layout.GridPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class VentaBoletos extends Application { 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"; private List<Integer> selectedSeats = new ArrayList<>(); private Map<Integer, Double> seatPrices = new HashMap<>(); // Nuevo: Mapa para almacenar precios de asientos private String eventName = ""; // Nuevo: Variable para almacenar el nombre del evento private String eventDate = ""; // Nuevo: Variable para almacenar la fecha del evento private GridPane seatGrid; // Nuevo: Referencia a la cuadrícula de asientos private Stage mainStage; // Nuevo: Referencia al Stage principal @Override public void start(Stage mainStage) { this.mainStage = mainStage; // Nuevo: Guardar referencia al Stage principal int totalSeats = 0; Map<Integer, String> seatStatus = new HashMap<>(); try { Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); System.out.println("Conexión realizada correctamente"); // Nuevo: Obtener información del evento (nombre y fecha) String eventQuery = "SELECT nombre, fecha FROM conciertos WHERE id = 1"; Statement eventStatement = conexion.createStatement(); ResultSet eventResultSet = eventStatement.executeQuery(eventQuery); if (eventResultSet.next()) { eventName = eventResultSet.getString("nombre"); // Nuevo: Almacenar nombre del evento eventDate = eventResultSet.getString("fecha"); // Nuevo: Almacenar fecha del evento } // Nuevo: Obtener información de los asientos (precio base y estado) String seatQuery = "SELECT a.id, a.precio_base, b.status FROM asientos a JOIN boleto b ON a.id = b.id_asiento WHERE b.idevento = 1"; Statement seatStatement = conexion.createStatement(); ResultSet seatResultSet = seatStatement.executeQuery(seatQuery); while (seatResultSet.next()) { int seatId = seatResultSet.getInt("id"); double precio = seatResultSet.getDouble("precio_base"); // Nuevo: Obtener precio del asiento String status = seatResultSet.getString("status"); seatStatus.put(seatId, status); seatPrices.put(seatId, precio); // Nuevo: Almacenar precio del asiento en el mapa totalSeats++; } conexion.close(); } catch (SQLException e) { System.out.println("Error en la conexión a la base de datos."); e.printStackTrace(); } mainStage.setTitle("Gestión de Boletos"); // Nuevo: Título y logo Label titleLabel = new Label("Sala de Conciertos"); titleLabel.getStyleClass().add("title"); // Nuevo: Aplicar clase CSS ImageView logo = new ImageView(new Image(getClass().getResourceAsStream("/logo.png"))); // Nuevo: Cargar imagen del logo logo.setFitWidth(100); // Nuevo: Ajustar ancho del logo logo.setFitHeight(100); // Nuevo: Ajustar altura del logo Label welcomeLabel = new Label("Seleccione sus asientos"); seatGrid = new GridPane(); // Nuevo: Inicializar la cuadrícula de asientos seatGrid.getStyleClass().add("seat-grid"); // Nuevo: Aplicar clase CSS Button confirmButton = new Button("Confirmar Compra"); confirmButton.getStyleClass().add("button"); // Nuevo: Aplicar clase CSS int cols = 5; int rows = (int) Math.ceil((double) totalSeats / cols); for (int seatNumber = 1; seatNumber <= totalSeats; seatNumber++) { int row = (seatNumber - 1) / cols; int col = (seatNumber - 1) % cols; Button seatButton = new Button("Asiento " + seatNumber); seatButton.getStyleClass().add("seat-button"); // Nuevo: Aplicar clase CSS int finalSeatNumber = seatNumber; if ("vendido".equals(seatStatus.getOrDefault(finalSeatNumber, "disponible"))) { seatButton.setDisable(true); } else { seatButton.setOnAction(e -> { if (!selectedSeats.contains(finalSeatNumber)) { selectedSeats.add(finalSeatNumber); seatButton.setStyle("-fx-background-color: #45a049;"); // Nuevo: Cambiar color a verde más oscuro } else { selectedSeats.remove(Integer.valueOf(finalSeatNumber)); seatButton.setStyle(""); } }); } seatGrid.add(seatButton, col, row); } // Nuevo: Lógica para el botón de confirmar compra confirmButton.setOnAction(e -> { if (selectedSeats.isEmpty()) { mostrarAlerta("Advertencia", "No se han seleccionado asientos", "Por favor, seleccione al menos un asiento."); } else { final List<Integer> finalSelectedSeats = new ArrayList<>(selectedSeats); final Map<Integer, Double> finalSeatPrices = new HashMap<>(seatPrices); final String finalEventName = eventName; final String finalEventDate = eventDate; VentanaPago ventanaPago = new VentanaPago(this); // Nuevo: Crear ventana de pago ventanaPago.mostrarVentanaPago(finalSelectedSeats, finalSeatPrices, finalEventName, finalEventDate); } }); // Nuevo: Layout principal con logo, título, cuadrícula y botón VBox mainLayout = new VBox(20, logo, titleLabel, welcomeLabel, seatGrid, confirmButton); mainLayout.setAlignment(Pos.TOP_CENTER); // Nuevo: Centrar elementos mainLayout.setPadding(new Insets(20)); // Nuevo: Agregar padding Scene mainScene = new Scene(mainLayout, 600, 500); // Nuevo: Aumentar tamaño de la ventana mainScene.getStylesheets().add(getClass().getResource("/styles.css").toExternalForm()); // Nuevo: Aplicar CSS mainStage.setScene(mainScene); mainStage.show(); } // Nuevo: Método para refrescar la interfaz después de una compra public void refrescarInterfaz() { selectedSeats.clear(); Map<Integer, String> seatStatus = cargarEstadoAsientos(); seatGrid.getChildren().clear(); int totalSeats = seatStatus.size(); int cols = 5; int rows = (int) Math.ceil((double) totalSeats / cols); for (int seatNumber = 1; seatNumber <= totalSeats; seatNumber++) { int row = (seatNumber - 1) / cols; int col = (seatNumber - 1) % cols; Button seatButton = new Button("Asiento " + seatNumber); seatButton.getStyleClass().add("seat-button"); // Nuevo: Aplicar clase CSS int finalSeatNumber = seatNumber; if ("vendido".equals(seatStatus.getOrDefault(finalSeatNumber, "disponible"))) { seatButton.setDisable(true); } else { seatButton.setOnAction(e -> { if (!selectedSeats.contains(finalSeatNumber)) { selectedSeats.add(finalSeatNumber); seatButton.setStyle("-fx-background-color: #45a049;"); // Nuevo: Cambiar color a verde más oscuro } else { selectedSeats.remove(Integer.valueOf(finalSeatNumber)); seatButton.setStyle(""); } }); } seatGrid.add(seatButton, col, row); } } // Nuevo: Método para cargar el estado de los asientos desde la base de datos private Map<Integer, String> cargarEstadoAsientos() { Map<Integer, String> seatStatus = new HashMap<>(); try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) { String query = "SELECT id_asiento, status FROM boleto WHERE idevento = 1"; Statement statement = conexion.createStatement(); ResultSet resultSet = statement.executeQuery(query); while (resultSet.next()) { int seatId = resultSet.getInt("id_asiento"); String status = resultSet.getString("status"); seatStatus.put(seatId, status); } } catch (SQLException e) { System.out.println("Error al cargar el estado de los asientos."); e.printStackTrace(); } return seatStatus; } // Nuevo: Método para mostrar alertas private void mostrarAlerta(String titulo, String encabezado, String contenido) { Alert alert = new Alert(Alert.AlertType.WARNING); alert.setTitle(titulo); alert.setHeaderText(encabezado); alert.setContentText(contenido); alert.showAndWait(); } public static void main(String[] args) { launch(args); } }