import Game;
import OXOMove;
import Board;
import Player;
import Move;
import java.awt.*;
import java.io.*;

public class OXO extends Panel implements Game {
     private Board board;

     public OXO(Board b) {
        board = b;
     }

    public Player validate(Move m) {
// Note that because of the usual limitation of the type system, we have
// to check that we have a coherent set of subclasses around. Or is there
// a better way?
      boolean ok = ((m instanceof OXOMove) && 
		    (((OXOMove)m).square()).owner() == null);
      return (ok ? ((((OXOMove)m).player() == board.noughtP) ?
		    board.crossP : board.noughtP)
	      : null);
    }

// check all possible winning combinations to see if player has won
// very boring way to code this!
public boolean hasWon(Player p) {
  if (
((board.owner(0,0) == p) && 
 (board.owner(0,1) == p) && 
 (board.owner(0,2) == p)) ||

((board.owner(1,0) == p) &&
 (board.owner(1,1) == p) &&
 (board.owner(1,2) == p)) ||

((board.owner(2,0) == p) &&
 (board.owner(2,1) == p) &&
 (board.owner(2,2) == p)) ||

((board.owner(0,0) == p) &&
 (board.owner(1,0) == p) &&
 (board.owner(2,0) == p)) ||

((board.owner(0,1) == p) &&
 (board.owner(1,1) == p) &&
 (board.owner(2,1) == p)) ||

((board.owner(0,2) == p) &&
 (board.owner(1,2) == p) &&
 (board.owner(2,2) == p)) ||

((board.owner(0,0) == p) &&
 (board.owner(1,1) == p) &&
 (board.owner(2,2) == p)) ||

((board.owner(0,2) == p) &&
 (board.owner(1,1) == p) &&
 (board.owner(2,0) == p)))
      {return true;}
  else {return false;}
}

public Player winner() {
  if (hasWon (board.noughtP)) {
    return board.noughtP;
  } else if (hasWon (board.crossP)) {
    return board.crossP;
  } else return null;
}

public boolean isDraw() {
  for (int i=0; i<3; i++) {
    for (int j=0; j<3; j++) {
      if (board.owner(i,j) == null) return false;
    }
  }
  return true;
}

}
