import CurrentPosition;
import Square;
import OXO;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
public class Board extends CurrentPosition implements ActionListener {
    public static Player noughtP;
    public static Player crossP;

    private static OXO game;
    private Square [][] squares = new Square [3][3];   
    private Player toMove;
    private Label messageLabel;
    private Button restartButton;
    private Panel boardPanel;

    public Square findSquare(int x, int y) {
	//KISS: just ask each square whether (x,y) is in it!
	for (int i = 0; i<3; i++) {
	    for (int j = 0; j<3; j++) {
		if (squares[i][j].isIn(x,y)) {
		    System.out.println("Got square "+ i + " " + j);
		    return squares[i][j];
		}
	    }
	}
	// no square claimed the point
	return null;
    }

    public void paint(Graphics g) {
        for (int i = 0; i<3; i++) {
	    for (int j = 0; j<3; j++) {
		squares[i][j].paint(g);
	    }
        }
    }

    public void update(Graphics g) {
	paint (g);
    }

    public void message(String s) {
	messageLabel.setText(s);
    }

    //should be making proper use of a layout manager?  
    public void init() {
	noughtP = new Player("0");
	crossP = new Player("X");
	toMove = crossP;
	messageLabel = new Label ("Noughts And Crosses");
	restartButton = new Button ("Start again");
	game = new OXO(this);
	addMouseListener(new MyAdapter());
	add(messageLabel);
	add(restartButton);
	restartButton.addActionListener(this);
	initBoard();
	repaint();
    }

    private void initBoard () {
	for (int i=0; i<3; i++) {
	    for (int j=0; j<3; j++) {
		squares[i][j] = 
		    new Square(i * 80,j * 80 + 100,80,80); 
	    }
	}
	repaint();
    }

    public void actionPerformed(ActionEvent e) {
	initBoard();
    }
    
    public Player owner (int i, int j) {
	return squares[i][j].owner();
    }

    //fairly generic...
    class MyAdapter extends MouseAdapter {
	public void mousePressed(MouseEvent e) {
	    // we've got a click. What does it mean?
	    int x = e.getX();
	    int y = e.getY();
	    Square square = findSquare(x,y);
	    if (square == null) {
		message ("Please click in a square");
	    } else {
		move = new OXOMove(toMove,square);
		Player next,winner;
		if ((next = game.validate(move)) != null) {
		    ((OXOMove)move).confirm();
		    if ((winner = (game.winner())) != null) {
			message("Player " + winner.glyph + " won!!");
		    } else {
			toMove = next;
			message("Ready for next move from " + toMove.glyph);
		    }
		} else {
		    message("Illegal move. Try again.");
		}
		repaint();
	    }
	}
    }
}
