package cs435ex1;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class PegPuzzle implements ActionListener {
	// Interface Components
	JButton leftEdge;

	JButton leftMid;

	JButton center;

	JButton rightMid;

	JButton farRight;

	boolean moveStarted = false;

	int firstClick;

	int secondClick;

	/**
	 * Create the GUI and show it. Invoked from the event-dispatching thread for
	 * thread safety.
	 */
	private static void createAndShowGUI() {

		// Create and set up the window.
		JFrame frame = new JFrame("Peg Puzzle");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container cont = frame.getContentPane();

		PegPuzzle app = new PegPuzzle();
		app.makeBoard(cont);

		// Display the window.
		frame.pack();
		frame.setVisible(true);
	}

	public void makeBoard(Container cont) {
		leftEdge = new JButton("[X]");
		leftEdge.addActionListener(this);
		leftMid = new JButton("[X]");
		leftMid.addActionListener(this);
		center = new JButton("[-]");
		center.addActionListener(this);
		rightMid = new JButton("[X]");
		rightMid.addActionListener(this);
		farRight = new JButton("[X]");
		farRight.addActionListener(this);

		cont.setLayout(new GridLayout(1, 0));

		// Add the buttons to form the game grid
		cont.add(leftEdge);
		cont.add(leftMid);
		cont.add(center);
		cont.add(rightMid);
		cont.add(farRight);
	}

	public static void main(String[] args) {
		// Schedule App's GUI create & show for event-dispatching thread
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				createAndShowGUI();
			}
		});
	}

	public void actionPerformed(ActionEvent ae) {
		// Find which button was pressed
		JButton b = (JButton) ae.getSource();
		// determine if pressed button is occupied
		boolean occupied = b.getText().equals("[X]");
		// record location of move's 1st click
		if (moveStarted == false) {
			// if peg not occupied, not a valid move
			if (!occupied)
				return;
			// Code first click location for future processing
			if (b == leftEdge)
				firstClick = -2;
			if (b == leftMid)
				firstClick = -1;
			if (b == center)
				firstClick = 0;
			if (b == rightMid)
				firstClick = 1;
			if (b == farRight)
				firstClick = 2;
			moveStarted = true; // good start
			return;
		} else { // 2nd click since move has already started
			// and after this, no matter what happens, the move has ended
			moveStarted = false;
			if (occupied) {
				// move invalidated (should be empty)
				return;
			}
			// 2nd location empty, set its location code
			if (b == leftEdge)
				secondClick = -2;
			if (b == leftMid)
				secondClick = -1;
			if (b == center)
				secondClick = 0;
			if (b == rightMid)
				secondClick = 1;
			if (b == farRight)
				secondClick = 2;

			// Based on 1st location, determine if 2nd
			// location and "jumped" location give a
			// legal move. If so update the board and
			// reset for next move
			boolean mid;
			switch (firstClick) {
			case -2: // start from extreme left
				if (secondClick != 0)
					return;
				// check if jumped a peg (leftMid)
				mid = leftMid.getText().equals("[X]");
				if (mid == true) {
					// move peg over and remove jumped peg
					leftEdge.setText("[-]");
					leftMid.setText("[-]");
					center.setText("[X]");
				}
				break;
			case -1: // start from center left
				if (secondClick != 1)
					return;
				// check if jumped a peg (center)
				mid = center.getText().equals("[X]");
				if (mid == true) {
					// move peg over and remove jumped peg
					leftMid.setText("[-]");
					center.setText("[-]");
					rightMid.setText("[X]");
				}
				break;

			case 0: // start from center 0
				if (secondClick == -2) {
					// check if jumped a peg leftward (leftMid)
					mid = leftMid.getText().equals("[X]");
					if (mid == true) {
						// move peg over and remove jumped peg
						center.setText("[-]");
						leftMid.setText("[-]");
						leftEdge.setText("[X]");
					}
				} else if (secondClick == 2) {
					// check if jumped a peg rightward (rightMid)
					mid = rightMid.getText().equals("[X]");
					if (mid == true) {
						// move peg over and remove jumped peg
						center.setText("[-]");
						rightMid.setText("[-]");
						farRight.setText("[X]");
					}
				}
				break;

			case 1: // start from center right
				if (secondClick != -1)
					return;
				// check if jumped a peg (center)
				mid = center.getText().equals("[X]");
				if (mid == true) {
					// move peg over and remove jumped peg
					rightMid.setText("[-]");
					center.setText("[-]");
					leftMid.setText("[X]");
				}
				break;
			case 2: // start from extreme right
				if (secondClick != 0)
					return;
				// check if jumped a peg (rightMid)
				mid = rightMid.getText().equals("[X]");
				if (mid == true) {
					// move peg over and remove jumped peg
					farRight.setText("[-]");
					rightMid.setText("[-]");
					center.setText("[x]");
				}
				break;

			} // end of switch
		} // end move has already started block

	} // end of actionPerformed method
}
