Skip to content
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SudokuGUI extends JFrame {
    private Sudoku juego;
    private JButton[][] botonesTablero;
    private JPanel panelTablero;
    private JButton botonDeshacer, botonReiniciar, botonNuevoJuego, botonSeleccionarNivel, botonSalir;
    private String nivelActual = "facil"; // Nivel por defecto

    public SudokuGUI() {
        // Inicializa el juego
        juego = new Sudoku();
        juego.iniciarJuego(nivelActual);

        // Configura la ventana
        setTitle("Sudoku");
        setSize(400, 600);  // Ajusta el tamaño para los nuevos botones
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        // Panel del tablero
        panelTablero = new JPanel(new GridLayout(9, 9));
        botonesTablero = new JButton[9][9];
        inicializarTablero();

        // Panel de botones
        JPanel panelBotones = new JPanel();
        panelBotones.setLayout(new GridLayout(2, 3, 10, 10)); // Botones distribuidos en 2 filas

        // Botón "Deshacer"
        botonDeshacer = new JButton("Deshacer");
        botonDeshacer.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                juego.deshacerUltimaJugada();
                actualizarTablero();
            }
        });
        panelBotones.add(botonDeshacer);

        // Botón "Reiniciar"
        botonReiniciar = new JButton("Reiniciar");
        botonReiniciar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                juego = new Sudoku(); // Reinicia el objeto Sudoku
                juego.iniciarJuego(nivelActual);
                actualizarTablero();
            }
        });
        panelBotones.add(botonReiniciar);

        // Botón "Nuevo Juego"
        botonNuevoJuego = new JButton("Nuevo Juego");
        botonNuevoJuego.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                juego = new Sudoku(); // Inicia un nuevo juego
                juego.iniciarJuego(nivelActual);
                actualizarTablero();
            }
        });
        panelBotones.add(botonNuevoJuego);

        // Botón "Seleccionar Nivel"
        botonSeleccionarNivel = new JButton("Seleccionar Nivel");
        botonSeleccionarNivel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                seleccionarNivel();
                juego = new Sudoku();
                juego.iniciarJuego(nivelActual); // Inicia el juego con el nuevo nivel
                actualizarTablero();
            }
        });
        panelBotones.add(botonSeleccionarNivel);

        // Botón "Salir"
        botonSalir = new JButton("Salir");
        botonSalir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0); // Cierra el programa
            }
        });
        panelBotones.add(botonSalir);

        // Agrega los paneles a la ventana
        add(panelTablero, BorderLayout.CENTER);
        add(panelBotones, BorderLayout.SOUTH);
    }

    private void inicializarTablero() {
        for (int fila = 0; fila < 9; fila++) {
            for (int columna = 0; columna < 9; columna++) {
                JButton boton = new JButton();
                int valor = juego.getTablero().getValor(fila, columna);
                if (valor != 0) {
                    boton.setText(String.valueOf(valor));
                    boton.setEnabled(false); // Los valores iniciales no se pueden cambiar
                } else {
                    boton.setText("");
                    final int f = fila;
                    final int c = columna;
                    boton.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            colocarNumero(f, c);
                        }
                    });
                }
                botonesTablero[fila][columna] = boton;
                panelTablero.add(boton);
            }
        }
    }

    private void colocarNumero(int fila, int columna) {
        String input = JOptionPane.showInputDialog(this, "Ingrese un número (1-9):");
        try {
            int numero = Integer.parseInt(input);
            if (numero >= 1 && numero <= 9) {
                if (juego.colocarNumero(fila, columna, numero)) {
                    botonesTablero[fila][columna].setText(String.valueOf(numero));
                } else {
                    JOptionPane.showMessageDialog(this, "Movimiento inválido.");
                }
            } else {
                JOptionPane.showMessageDialog(this, "Número fuera de rango.");
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Entrada inválida.");
        }

        juego.mostrarMensajeEstado();
        if (juego.verificarJuego()) {
            JOptionPane.showMessageDialog(this, "¡Felicidades! Has completado el Sudoku.");
        }
    }

    private void actualizarTablero() {
        for (int fila = 0; fila < 9; fila++) {
            for (int columna = 0; columna < 9; columna++) {
                int valor = juego.getTablero().getValor(fila, columna);
                if (valor != 0) {
                    botonesTablero[fila][columna].setText(String.valueOf(valor));
                } else {
                    botonesTablero[fila][columna].setText("");
                }
            }
        }
    }

    private void seleccionarNivel() {
        String[] opciones = {"facil", "intermedio", "dificil"};
        nivelActual = (String) JOptionPane.showInputDialog(this, 
                "Selecciona el nivel de dificultad:", 
                "Seleccionar Nivel", 
                JOptionPane.QUESTION_MESSAGE, 
                null, 
                opciones, 
                opciones[0]);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new SudokuGUI().setVisible(true);
            }
        });
    }
}