package net.sf.bloodball.fit.system;

import java.awt.Point;
import java.util.List;

import net.sf.bloodball.BloodballGame;
import net.sf.bloodball.confguration.random.IRandomizer;
import net.sf.bloodball.confguration.team.ITeam;
import net.sf.bloodball.gameflow.TurnFlowController;
import net.sf.bloodball.gameflow.state.MoveSelectionState;
import net.sf.bloodball.model.ball.IBall;
import net.sf.bloodball.model.player.IFieldInterpreter;
import net.sf.bloodball.model.player.IPlayer;
import net.sf.bloodball.model.player.ITeamFormation;
import net.sf.bloodball.presenter.event.IGameBoardController;

public class TestSystem {

  private static BloodballGame bloodballGame;
  private static TestGame testGame;

  public static void reset(String beginningTeam) {
    testGame = new TestGame(beginningTeam);
  }

  public static ITeam getTeam(String name) {
    return testGame.getTeam(name);
  }

  public static ITeamFormation getFormation(String name) {
    TurnFlowController turnFlowController = getTurnFlow();
    return turnFlowController.getTeams().getTeamFormation(getTeam(name));
  }

  private static TurnFlowController getTurnFlow() {
    return testGame.getTurnFlowController();
  }

  public static ITeamFormation getActiveTeam() {
    return testGame.getPresenter().getGameFlowController().getActiveTeam();
  }

  public static IGameBoardController getGameBoardController() {
    return testGame.getGameBoardController();
  }

  public static List getPlayersOnField() {
    return getTurnFlow().getField().getAllFieldPlayers();
  }

  public static Point getPlayerPosition(IPlayer player) {
    return getFieldInterpreter().getPlayerPosition(player);
  }

  private static IFieldInterpreter getFieldInterpreter() {
    return getTurnFlow().getField();
  }

  public static boolean isContinueButtonEnabled() {
    return getTurnFlow().getState().mayEndTurn();
  }

  public static IPlayer getPlayer(String team, int number) {
    return getFormation(team).getPlayerByNumber(number);
  }

  public static void setPlayer(IPlayer player, Point position) {
    getFieldInterpreter().setPlayer(position, player);
  }

  public static void setBall(Point point) {
    getTurnFlow().getBall().setPosition(point);
  }

  public static void setBallPossingPlayer(IPlayer player, Point position) {
    setPlayer(player, position);
    setBall(position);
    player.catchBall(getBall());
  }

  public static IBall getBall() {
    return getTurnFlow().getBall();
  }

  private static MoveSelectionState createMoveSelectionState() {
    return new MoveSelectionState(getTurnFlow().getGameFlow(), getBall(), getTurnFlow());
  }

  public static void prepare() {
    reset("home"); //$NON-NLS-1$
    getTurnFlow().setState(createMoveSelectionState());
  }

  public static void setRandomizer(IRandomizer randomizer) {
    getTurnFlow().setRandomizer(randomizer);
  }

}