import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class Game extends Applet implements MouseListener, ActionListener
{
	private BoardPanel boardPanel;
	private Panel buttonPanel;
	private BrickComponent brickComponent[];
	private Button newGameButton;
	private Button aiStepButton;
	private Choice aiLevelChoice;
	private Label currentPlayerLabel;
	private Label whitePointsLabel;
	private Label blackPointsLabel;
	private Label statusLabel;
	
	private Board gameBoard;
	
	private Image whiteBrickImage;
	private Image blackBrickImage;
	private Image backgroundImage;
	
	private int aiLevel;
	private boolean newGame;
	private boolean passedLast;
	
	public void init()
	{
		try
		{
			whiteBrickImage = getImage(new URL(getCodeBase(), "images/whitebrick.gif"));
		}		
		catch(MalformedURLException exception)
		{
			System.out.println("Felaktig URL1!");
			//exit();
		}

		try
		{
			blackBrickImage = getImage(new URL(getCodeBase(), "images/blackbrick.gif"));
		}		
		catch(MalformedURLException exception)
		{
			System.out.println("Felaktig URL2!");
			//exit();
		}

		try
		{
			backgroundImage = getImage(new URL(getCodeBase(), "images/background.jpg"));
		}		
		catch(MalformedURLException exception)
		{
			System.out.println("Felaktig URL3!");
			//exit();
		}
		
		aiLevel = 0;
		newGame = true;
		passedLast = false;

		boardPanel = new BoardPanel(backgroundImage);
		buttonPanel = new Panel();
		brickComponent = new BrickComponent[64];
		gameBoard = new Board(1);
		
		newGameButton = new Button("New Game");
		aiStepButton = new Button("AI Step");
		aiLevelChoice = new Choice();
		statusLabel = new Label("Welcome to Othello v1.1 \u00a9 2002 Patrik Axelsson & Johan André");
		currentPlayerLabel = new Label(" ");
		whitePointsLabel = new Label("0");
		blackPointsLabel = new Label("0");
		
		aiLevelChoice.addItem("0");
		aiLevelChoice.addItem("1");
		aiLevelChoice.select(1);
				
		for(int i = 0; i < 64; i++)
		{
			brickComponent[i] = new BrickComponent(0, whiteBrickImage, blackBrickImage);
			boardPanel.add(brickComponent[i]);
		}
		
		for(int i = 0; i < 64; i++)
			brickComponent[i].setColor(gameBoard.getBrickColor(i));

		whitePointsLabel.setText("" + gameBoard.getPoints(1));
		blackPointsLabel.setText("" + gameBoard.getPoints(-1));

		switch(gameBoard.getCurrentColor())
		{
			case 1:
			{
				currentPlayerLabel.setText("White");
				currentPlayerLabel.setForeground(Color.white);
				break;
			}
			
			case -1:
			{
				currentPlayerLabel.setText("Black");
				currentPlayerLabel.setForeground(Color.black);
				break;
			}
		}
		
	
		setLayout(new BorderLayout());
		buttonPanel.setLayout(new GridLayout(20,1));

		buttonPanel.add(newGameButton);
		buttonPanel.add(aiStepButton);
		buttonPanel.add(new Label());
		buttonPanel.add(new Label());
		buttonPanel.add(new Label("AI Level:"));
		buttonPanel.add(aiLevelChoice);
		buttonPanel.add(new Label());
		buttonPanel.add(new Label());
		buttonPanel.add(new Label("Current Player:"));
		buttonPanel.add(currentPlayerLabel);
		buttonPanel.add(new Label());
		buttonPanel.add(new Label());
		buttonPanel.add(new Label("White points:"));
		buttonPanel.add(whitePointsLabel);
		buttonPanel.add(new Label());
		buttonPanel.add(new Label("Black points:"));
		buttonPanel.add(blackPointsLabel);
		buttonPanel.add(new Label());
		buttonPanel.add(new Label());
		buttonPanel.add(new Label());
				
		add(boardPanel, BorderLayout.WEST);
		add(buttonPanel, BorderLayout.EAST);
		add(statusLabel, BorderLayout.SOUTH);
		setListeners();
	}
	
	public void updateBoard()
	{
		int currentColor;
		
		currentColor = gameBoard.getCurrentColor();
		
		if(newGame)
		{
			statusLabel.setText("");
			newGame = false;
		}
		

		if(passedLast)
		{
			statusLabel.setText("");
			passedLast = false;
		}
		
		
		for(int i = 0; i < 64; i++)
		{
			if(gameBoard.isBrickChanged(i))
			{
				brickComponent[i].setColor(gameBoard.getBrickColor(i));
				brickComponent[i].repaint();
			}
		}
		
		gameBoard.clearChangedBricks();
		
		whitePointsLabel.setText("" + gameBoard.getPoints(1));
		blackPointsLabel.setText("" + gameBoard.getPoints(-1));
		
		switch(gameBoard.isGameOver())
		{
			case 0:
			{
				
				if(!gameBoard.canMakeMove())
				{
					switch(currentColor)
					{
						case 1:
						{
							statusLabel.setText("White had to pass!");
							break;
						}
						
						case -1:
						{
							statusLabel.setText("Black had to pass!");
							break;
						}
					}
					
					passedLast = true;
				}
				switch(gameBoard.getCurrentColor())
				{
					case 1:
					{
						currentPlayerLabel.setText("White");
						currentPlayerLabel.setForeground(Color.white);
						break;
					}
					
					case -1:
					{
						currentPlayerLabel.setText("Black");
						currentPlayerLabel.setForeground(Color.black);
						break;
					}
				}			
				break;
			}
			case 1:
			{
				statusLabel.setText("White wins!");
				break;
			}
			case -1:
			{
				statusLabel.setText("Black wins!");
				break;
			}
			case 2:
			{
				statusLabel.setText("Even!");
				break;
			}
		}
	}
	
	public void setListeners()
	{
		for(int i = 0; i < 64; i++)
		{
			brickComponent[i].addMouseListener(this);
		}
		
		newGameButton.addActionListener(this);
		aiStepButton.addActionListener(this);
	}

	public void unSetListeners()
	{
		for(int i = 0; i < 64; i++)
		{
			brickComponent[i].removeMouseListener(this);
		}
		
		newGameButton.removeActionListener(this);
		aiStepButton.removeActionListener(this);
	}

	
	public void actionPerformed(ActionEvent e)
	{
		if(e.getSource() == newGameButton)
		{
			//unSetListeners();
			gameBoard.resetGame(1);
	
			for(int i = 0; i < 64; i++)
			{
				brickComponent[i].setColor(gameBoard.getBrickColor(i));
				brickComponent[i].repaint();
				
			}
			
			whitePointsLabel.setText("" + gameBoard.getPoints(1));
			blackPointsLabel.setText("" + gameBoard.getPoints(-1));
	
			switch(gameBoard.getCurrentColor())
			{
				case 1:
				{
					currentPlayerLabel.setText("White");
					currentPlayerLabel.setForeground(Color.white);
					break;
				}
				
				case -1:
				{
					currentPlayerLabel.setText("Black");
					currentPlayerLabel.setForeground(Color.black);
					break;
				}
			}			
	
	
			statusLabel.setText("Welcome to Othello v1.1 \u00a9 2002 Patrik Axelsson & Johan André");
			newGame = true;
			passedLast = false;
			//setListeners();
		}
		
		else if(e.getSource() == aiStepButton)
		{
			//unSetListeners();
			gameBoard.aiSetBrick(aiLevelChoice.getSelectedIndex());
			updateBoard();
			//setListeners();
		}
	}
	
	public void mouseClicked(MouseEvent e)
	{
		for(int i = 0; i < 64; i++)
		{		
			if(e.getSource() == brickComponent[i])
			{
				//unSetListeners();
				gameBoard.setBrick(i);
				updateBoard();
				//setListeners();
			}
		}
	}
	
	public void mouseEntered(MouseEvent e)
	{
	
	}
	
	public void mouseExited(MouseEvent e)
	{
	
	}


	public void mousePressed(MouseEvent e)
	{
	
	}

	public void mouseReleased(MouseEvent e)
	{
	
	}
}
