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