package org.example.saladeconciertos; import javafx.application.Application; 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.Label; import javafx.scene.effect.DropShadow; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.stage.Stage; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; 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<>(); private String eventName = ""; private String eventDate = ""; private int eventId = 0; private GridPane seatGrid; private Stage mainStage; @Override public void start(Stage mainStage) { this.mainStage = mainStage; EscogerEvento escogerEvento = new EscogerEvento(); escogerEvento.mostrarVentanaSeleccionEvento(mainStage, this); } public int getEventId() { return eventId; } public void setEventId(int eventId) { this.eventId = eventId; } public void cargarInformacionEvento() { try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) { String eventQuery = "SELECT nombre, fecha FROM conciertos WHERE id = ?"; PreparedStatement eventStatement = conexion.prepareStatement(eventQuery); eventStatement.setInt(1, eventId); ResultSet eventResultSet = eventStatement.executeQuery(); if (eventResultSet.next()) { eventName = eventResultSet.getString("nombre"); eventDate = eventResultSet.getString("fecha"); } } catch (SQLException e) { System.out.println("Error al cargar la información del evento."); e.printStackTrace(); } } public void mostrarVentanaVentaBoletos(Stage mainStage) { int totalSeats = 0; Map<Integer, String> seatStatus = new HashMap<>(); try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) { 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 = ?"; PreparedStatement seatStatement = conexion.prepareStatement(seatQuery); seatStatement.setInt(1, eventId); ResultSet seatResultSet = seatStatement.executeQuery(); while (seatResultSet.next()) { int seatId = seatResultSet.getInt("id"); double precio = seatResultSet.getDouble("precio_base"); String status = seatResultSet.getString("status"); seatStatus.put(seatId, status); seatPrices.put(seatId, precio); totalSeats++; } } catch (SQLException e) { System.out.println("Error en la conexión a la base de datos."); e.printStackTrace(); } mainStage.setTitle("Gestión de Boletos"); // Modificado: Título con el nombre del evento Label titleLabel = new Label(eventName); titleLabel.getStyleClass().add("title"); // 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 label de bienvenida Label welcomeLabel = new Label("Seleccione sus asientos"); seatGrid = new GridPane(); seatGrid.getStyleClass().add("seat-grid"); seatGrid.setHgap(10); // Espaciado horizontal entre celdas seatGrid.setVgap(10); // Espaciado vertical entre celdas seatGrid.setPadding(new Insets(20)); // Padding alrededor del GridPane // Crear y configurar el botón de confirmación Button confirmButton = new Button("Confirmar Compra"); confirmButton.getStyleClass().add("button"); 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; char rowLetter = (char) ('A' + row); String seatLabel = rowLetter + String.valueOf(col + 1); Button seatButton = new Button(seatLabel); seatButton.getStyleClass().add("seat-button"); seatButton.setMinSize(80, 40); // Tamaño mínimo de cada botón seatButton.setMaxSize(80, 40); // Tamaño máximo de cada botón seatButton.setPadding(new Insets(10)); // Padding dentro de cada botón 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;"); } else { selectedSeats.remove(Integer.valueOf(finalSeatNumber)); seatButton.setStyle(""); } }); } seatGrid.add(seatButton, col, row); } 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); ventanaPago.mostrarVentanaPago(finalSelectedSeats, finalSeatPrices, finalEventName, finalEventDate); } }); // Nuevo: Botón para regresar a la ventana de selección de eventos Button backButton = new Button("Regresar"); backButton.getStyleClass().add("button"); backButton.setOnAction(e -> { EscogerEvento escogerEvento = new EscogerEvento(); escogerEvento.mostrarVentanaSeleccionEvento(mainStage, this); }); // Añadir sombra al botón "Regresar" DropShadow shadow = new DropShadow(); shadow.setColor(Color.rgb(0, 0, 0, 0.25)); shadow.setRadius(10); shadow.setOffsetX(0); shadow.setOffsetY(2); backButton.setEffect(shadow); // Colocar el botón "Regresar" en la esquina superior izquierda BorderPane borderPane = new BorderPane(); borderPane.setPadding(new Insets(10)); borderPane.setTop(backButton); BorderPane.setAlignment(backButton, Pos.TOP_LEFT); VBox mainLayout = new VBox(20, logo, titleLabel, welcomeLabel, seatGrid, confirmButton); mainLayout.setAlignment(Pos.TOP_CENTER); mainLayout.setPadding(new Insets(20)); borderPane.setCenter(mainLayout); Scene mainScene = new Scene(borderPane, 540, 600); mainScene.getStylesheets().add(getClass().getResource("/styles.css").toExternalForm()); mainStage.setScene(mainScene); mainStage.show(); } 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; char rowLetter = (char) ('A' + row); String seatLabel = rowLetter + String.valueOf(col + 1); Button seatButton = new Button(seatLabel); seatButton.getStyleClass().add("seat-button"); seatButton.setMinSize(80, 40); // Tamaño mínimo de cada botón seatButton.setMaxSize(80, 40); // Tamaño máximo de cada botón seatButton.setPadding(new Insets(10)); // Padding dentro de cada botón 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;"); } else { selectedSeats.remove(Integer.valueOf(finalSeatNumber)); seatButton.setStyle(""); } }); } seatGrid.add(seatButton, col, row); } } 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 = ?"; PreparedStatement statement = conexion.prepareStatement(query); statement.setInt(1, eventId); ResultSet resultSet = statement.executeQuery(); 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; } public 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 void actualizarEstadoBoletos(List<Integer> selectedSeats, int idevento) { try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) { String updateQuery = "UPDATE boleto SET status = 'vendido', fechaVenta = CURDATE() WHERE id_asiento = ? AND idevento = ?"; PreparedStatement preparedStatement = conexion.prepareStatement(updateQuery); for (int seat : selectedSeats) { preparedStatement.setInt(1, seat); preparedStatement.setInt(2, idevento); preparedStatement.executeUpdate(); } System.out.println("Estado de los boletos actualizado correctamente."); } catch (SQLException e) { System.out.println("Error al actualizar el estado de los boletos."); e.printStackTrace(); } } public static void main(String[] args) { launch(args); } }