From ee1b46cadfa7ded8a249e90558c76a682e5cf5b6 Mon Sep 17 00:00:00 2001
From: "Luis.Aguilar" <aguilar.luiseder27@gmail.com>
Date: Sun, 9 Mar 2025 12:25:15 -0600
Subject: [PATCH] Modificado VentanaPago(agregue metodos de pago)

---
 .../example/saladeconciertos/VentanaPago.java | 122 ++++++++++++++++--
 1 file changed, 113 insertions(+), 9 deletions(-)

diff --git a/src/main/java/org/example/saladeconciertos/VentanaPago.java b/src/main/java/org/example/saladeconciertos/VentanaPago.java
index 312a6b8..c7a2741 100644
--- a/src/main/java/org/example/saladeconciertos/VentanaPago.java
+++ b/src/main/java/org/example/saladeconciertos/VentanaPago.java
@@ -1,14 +1,18 @@
 package org.example.saladeconciertos;
+
 import javafx.scene.Scene;
 import javafx.scene.control.*;
 import javafx.scene.layout.VBox;
 import javafx.stage.Stage;
 import javafx.geometry.Insets;
 import javafx.geometry.Pos;
+import javafx.scene.layout.Priority;
+import javafx.scene.layout.Region;
 
 import java.sql.*;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 public class VentanaPago {
     private static final String DB_URL = "jdbc:mysql://sql10.freesqldatabase.com:3306/sql10766655";
@@ -28,7 +32,7 @@ public class VentanaPago {
         VBox paymentLayout = new VBox(20);
         paymentLayout.setPadding(new Insets(20));
         paymentLayout.getStyleClass().add("payment-window"); // Aplicar clase CSS
-        paymentLayout.setAlignment(Pos.CENTER);
+        paymentLayout.setAlignment(Pos.TOP_CENTER);
 
         // Título de la ventana
         Label titleLabel = new Label("Confirmar Compra");
@@ -47,33 +51,133 @@ public class VentanaPago {
         nameField.setPromptText("Nombre del cliente");
         nameField.setMaxWidth(200);
 
+        // Selección de método de pago
+        ChoiceBox<String> paymentMethod = new ChoiceBox<>();
+        paymentMethod.getItems().addAll("Tarjeta de Crédito/Débito", "PayPal");
+        paymentMethod.setValue(null); // No seleccionar ningún método por defecto
+
+        // Campos para tarjeta de crédito/débito
+        VBox cardFields = new VBox(10);
+        cardFields.setAlignment(Pos.TOP_CENTER); // Centrar los campos
+        TextField cardNumberField = new TextField();
+        cardNumberField.setPromptText("Número de tarjeta (13 dígitos)");
+        cardNumberField.setMaxWidth(200);
+
+        TextField expiryDateField = new TextField();
+        expiryDateField.setPromptText("MM/YY");
+        expiryDateField.setMaxWidth(200);
+
+        TextField cvvField = new TextField();
+        cvvField.setPromptText("CVV");
+        cvvField.setMaxWidth(200);
+
+        cardFields.getChildren().addAll(cardNumberField, expiryDateField, cvvField);
+        cardFields.setVisible(false); // Ocultar al inicio
+
+        // Campo para PayPal
+        VBox paypalFields = new VBox(10);
+        paypalFields.setAlignment(Pos.TOP_CENTER); // Centrar los campos
+        TextField emailField = new TextField();
+        emailField.setPromptText("Correo electrónico de PayPal");
+        emailField.setMaxWidth(200);
+
+        paypalFields.getChildren().add(emailField);
+        paypalFields.setVisible(false); // Ocultar al inicio
+
         // Botón para confirmar el pago
         Button payButton = new Button("Pagar");
         payButton.getStyleClass().add("button"); // Aplicar clase CSS
+        payButton.setDisable(true); // Deshabilitar al inicio
+
+        // Contenedor dinámico para campos y botón
+        VBox dynamicContainer = new VBox(10);
+        dynamicContainer.setAlignment(Pos.TOP_CENTER); // Centrar el contenido
+
+        // Mostrar u ocultar campos según el método de pago seleccionado
+        paymentMethod.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> {
+            boolean isCard = newVal != null && newVal.equals("Tarjeta de Crédito/Débito");
+            boolean isPayPal = newVal != null && newVal.equals("PayPal");
+
+            cardFields.setVisible(isCard);
+            paypalFields.setVisible(isPayPal);
+
+            // Habilitar el botón de pago si se selecciona un método
+            payButton.setDisable(newVal == null);
+
+            // Actualizar el contenedor dinámico
+            dynamicContainer.getChildren().clear();
+            if (isCard) {
+                dynamicContainer.getChildren().addAll(cardFields, payButton);
+            } else if (isPayPal) {
+                dynamicContainer.getChildren().addAll(paypalFields, payButton);
+            } else {
+                dynamicContainer.getChildren().add(payButton);
+            }
+        });
 
         payButton.setOnAction(e -> {
             String clientName = nameField.getText();
             if (clientName.isEmpty()) {
                 mostrarAlerta("Advertencia", "Nombre del cliente vacío", "Por favor, ingrese el nombre del cliente.");
-            } else {
-                generarTicket(clientName, selectedSeats, seatPrices, eventName, eventDate, totalPrice);
-                paymentStage.close();
-
-                // Refrescar la interfaz de VentaBoletos después de cerrar la ventana de pago
-                ventaBoletos.refrescarInterfaz();
+                return;
             }
+
+            String method = paymentMethod.getValue();
+            if (method.equals("Tarjeta de Crédito/Débito")) {
+                String cardNumber = cardNumberField.getText();
+                String expiryDate = expiryDateField.getText();
+                String cvv = cvvField.getText();
+
+                if (!validarTarjeta(cardNumber, expiryDate, cvv)) {
+                    mostrarAlerta("Error", "Datos de tarjeta inválidos", "Por favor, ingrese un número de tarjeta válido (13 dígitos), fecha (MM/YY) y CVV.");
+                    return;
+                }
+            } else if (method.equals("PayPal")) {
+                String email = emailField.getText();
+                if (!validarEmail(email)) {
+                    mostrarAlerta("Error", "Correo inválido", "Por favor, ingrese un correo electrónico válido.");
+                    return;
+                }
+            }
+
+            // Si todo está correcto, generar el ticket
+            generarTicket(clientName, selectedSeats, seatPrices, eventName, eventDate, totalPrice);
+            paymentStage.close();
+            ventaBoletos.refrescarInterfaz();
         });
 
         // Agregar elementos al layout
-        paymentLayout.getChildren().addAll(titleLabel, eventLabel, dateLabel, totalLabel, new Label("Nombre del cliente:"), nameField, payButton);
+        paymentLayout.getChildren().addAll(
+                titleLabel, eventLabel, dateLabel, totalLabel,
+                new Label("Nombre del cliente:"), nameField,
+                new Label("Método de pago:"), paymentMethod,
+                dynamicContainer
+        );
+
+        // Envolver el layout en un ScrollPane
+        ScrollPane scrollPane = new ScrollPane(paymentLayout);
+        scrollPane.setFitToWidth(true);
+        scrollPane.setFitToHeight(true);
 
         // Configurar la escena y mostrar la ventana
-        Scene paymentScene = new Scene(paymentLayout, 400, 300);
+        Scene paymentScene = new Scene(scrollPane, 400, 450);
         paymentScene.getStylesheets().add(getClass().getResource("/styles.css").toExternalForm()); // Aplicar CSS
         paymentStage.setScene(paymentScene);
         paymentStage.show();
     }
 
+    // Método para validar tarjeta
+    private boolean validarTarjeta(String cardNumber, String expiryDate, String cvv) {
+        return cardNumber.matches("\\d{13}") && // 13 dígitos
+                expiryDate.matches("(0[1-9]|1[0-2])/[0-9]{2}") && // MM/YY
+                cvv.matches("\\d{3}"); // 3 dígitos
+    }
+
+    // Método para validar email
+    private boolean validarEmail(String email) {
+        return Pattern.compile("^[A-Za-z0-9+_.-]+@(.+)$").matcher(email).matches();
+    }
+
     private void generarTicket(String clientName, List<Integer> selectedSeats, Map<Integer, Double> seatPrices, String eventName, String eventDate, double totalPrice) {
         StringBuilder ticketDetails = new StringBuilder();
         ticketDetails.append("Evento: ").append(eventName).append("\n");