package teamXXX;

import battlecode.common.*;

public abstract class BasePlayer implements Runnable {
	
	protected RobotState myState;

	protected final RobotController rc;
	
	public BasePlayer(RobotController rc) {
		this.rc = rc;
		myState = RobotState.SEEKING_ENERGON;
	}

	public final void run() {
		
		initialize();
				
		while (true) {
			
			updateState();
			
			try{
				
				switch(myState) {
					case SEEKING_ENERGON:
						seekEnergon();
						break;
					case GUARDING_ARCHON:
						guardArchon();
						break;
					case SEEKING_ENEMY:
						seekEnemy();
						break;
					// ... more here ...
					default:
						rc.yield();
						
				}				
			
			}catch(Exception e) {
				System.out.println(e.getMessage());
			}
		}
	}
	
	protected abstract void initialize();

	public RobotController getRobotController() {
		return this.rc;
	}
	
	
	protected abstract void updateState();
		
	public void setState(RobotState newState) {
		myState = newState;
	}
	
	protected void seekEnergon() {
		// do stuff here, or override this method with SoldierPlayer, ArchonPlayer, etc.
	}
	
	protected void guardArchon() {
		// do stuff here, or override this method with SoldierPlayer, ArchonPlayer, etc.
	}
	
	protected void seekEnemy() {
		// do stuff here, or override this method with SoldierPlayer, ArchonPlayer, etc.
	}
	
}
