package xmpDynamicType;

import java.util.ArrayList;

public class Players {
	
	private ArrayList<Character> team;
	
	/**
	 * 
	 */
	public Players() {
		team = new ArrayList<Character>();
	}
	
	public void newWarrior(Warrior newbie) {
		team.add(newbie);
	}
	
	public void newWorker(Builder newbie) {
		team.add(newbie);
	}
	
	public void age() {
		for(Character player : team) { player.age(); }
		for(int i=team.size()-1;i>=0;i--) {
			if (team.get(i).getStrength()==0) {
				// System.out.println("Removing :" + team.get(i));
				team.get(i).eulogy();
				team.remove(i);
			}
		}
	}
	
	public void list() {
		System.out.println("  Army:");
		for(Character player : team) {
			if (player instanceof Warrior) {
				System.out.println("     " + player);
			}
		}
		System.out.println("  Builders:");
		for(Character player : team) {
			if (player instanceof Builder) {
				System.out.println("     " + player);
			}
		}
	}
	
	public int numBuilders() {
		int numBuilders=0;
		for(Character player : team) {
			if (player instanceof Builder) {
				numBuilders++;
			}
		}
		return numBuilders;
	}
	
	public int numWarriors() {
		int numWarriors=0;
		for(Character player : team) {
			if (player instanceof Warrior) {
				numWarriors++;
			}
		}
		return numWarriors;
	}
	
	public Builder getBuilder(int i) {
		int numFound=-1;
		for(Character player : team) {
			if (player instanceof Builder) {
				numFound++;
				if (numFound==i) {
					return (Builder) player; // Upcast is legal here!
				}
			}
		}
		return null;
	}
	
	public Warrior getWarrior(int i) {
		int numFound=-1;
		for(Character player : team) {
			if (player instanceof Warrior) {
				numFound++;
				if (numFound==i) {
					return (Warrior) player; // Upcast is legal here!
				}
			}
		}
		return null;
	}
	
	public void interact(Players them) {
		int nf = Math.min(this.numWarriors(),them.numWarriors());
		for(int i=0; i<nf; i++) {
			this.getWarrior(i).fight(them.getWarrior(i));
			Warrior child = this.getWarrior(i).mate(them.getWarrior(i));
			if (child != null) { newWarrior(child); }
		}
		nf=Math.min(this.numBuilders(), them.numBuilders());
		for(int i=0; i<nf; i++) {
			Builder child = this.getBuilder(i).mate(them.getBuilder(i));
			if (child != null) { newWorker(child); } 
		}
	}


	public static void main(String[] args) {
		Players red = new Players();
		red.newWarrior(new Warrior("Jack Red"));
		red.newWarrior(new Warrior("Jane Red"));
		red.newWorker(new Builder("Carpenter Red"));
		red.newWorker(new Builder("Dauber Red"));
		Players blue = new Players();
		blue.newWarrior(new Warrior("Ogre Blue"));
		blue.newWarrior(new Warrior("Xena Blue"));
		blue.newWorker(new Builder("Cookie Blue"));
		blue.newWorker(new Builder("Smithy Blue"));
		for(int i=0; i<100; i++) {
			red.age();
			blue.age();
			if (0==i%3) red.interact(blue);
			if (1==i%3) blue.interact(red);
			if (i>0 && 0==i%5) {
				System.out.println("After " + i + " iterations...");
				System.out.println("Red Players:");
				red.list();
				System.out.println("Blue Players:");
				blue.list();
			}
		}
	}

}
