import java.awt.GridLayout;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class PuzzleGUI extends JFrame {
    
    private JPanel buttonPanel;
    private JButton[] buttons;
    private Puzzle puzzle;

    public PuzzleGUI() {
        super("15 Puzzle! (Get 'em in order!)");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        setSize(400,400);
        buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(4, 4));
        buttons = new JButton[16];
        for (int i = 0; i < 16; i++) {
            String buttonText = (i < 15 ? "" + (i+1) : "");
            buttons[i] = new JButton(buttonText);
            buttonPanel.add(buttons[i]);
        }
        this.add(buttonPanel);

        puzzle = new Puzzle();
        puzzle.shuffle();
        update();
        
        this.addKeyListener(new KeyListener() {

            public void keyTyped(KeyEvent e) {
                System.out.println(e.getKeyChar());
            }

            public void keyPressed(KeyEvent e) {
                switch (e.getKeyCode()) {
                case KeyEvent.VK_LEFT  : puzzle.slide(Puzzle.LEFT); update(); break;
                case KeyEvent.VK_UP    : puzzle.slide(Puzzle.UP); update(); break;
                case KeyEvent.VK_RIGHT : puzzle.slide(Puzzle.RIGHT); update(); break;
                case KeyEvent.VK_DOWN  : puzzle.slide(Puzzle.DOWN); update(); break;
                }
            }
            
            public void keyReleased(KeyEvent e) {}
        });
        
        this.setFocusable(true);
        this.requestFocusInWindow(); 
        
        this.pack();
        this.setVisible(true);
    }
    
    public void update() {
        for (int r = 0; r < 4; r++)
            for (int c = 0; c < 4; c++) 
                buttons[4*r+c].setText(puzzle.get(r, c));
        if (puzzle.isSolved()) {
            JOptionPane.showMessageDialog(null, "Want to try again?", "Congratulations!", JOptionPane.INFORMATION_MESSAGE);
            puzzle.shuffle();
        }
    }
    
    public static void main (String[] args) {
        PuzzleGUI pg = new PuzzleGUI();
    }
}

