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);
    }
}