//The design among these 3 classes needs improvement, and the code has a couple of bugs, too.
//Improve the design and fix the bugs.
//The public interface of Player should remain the same as it is now.

//Hints:
	//Avoid duplicate data
	//Methods and instance data should have high cohesion
	//Coupling should be loose between classes

import java.util.*;

public class Player {
	private String name;
	private CoinInventory coinInventory;
	private ArrayList<Item> otherInventory;
	private int encumbrance;

	public Player(String name) {
		this.name = name;
		coinInventory = new CoinInventory();
		otherInventory = new ArrayList<Item>();
		encumbrance = 0;
	}

	public void addItem(Item item) {
		otherInventory.add(item);
	}

	public void collectMoney(int cp, int sp, int ep, int gp, int pp) {
		int[] moneys = coinInventory.getCoins();
		moneys[0] += cp;
		moneys[1] += sp;
		moneys[2] += ep;
		moneys[3] += gp;
		moneys[4] += pp;
		coinInventory.setCoins(moneys);
	}

	public double getRunningSpeed() {
		double speed = 5 * (1 - getEncumbrance() / 1000.0); //Speed 5 if unencumbered; speed 0 if 1000 units carried or more.
		if (speed < 0) {
			return 0;
		}
		else {
			return speed;
		}
	}

	public double getMoneyValue() {
		int[] moneys = coinInventory.getCoins();
		return .01 * moneys[0] + .1 * moneys[1] + .5 * moneys[2] + 1 * moneys[3] + 5 * moneys[4];
	}

	public int getEncumbrance() {
		int[] moneys = coinInventory.getCoins();
		return moneys[0] + moneys[1] + moneys[2] + moneys[3] + moneys[4] + encumbrance;
	}

	//Test method.
	public static void main(String[] args) {
		Player p = new Player("Whistlestick");
		Item sword = new Item("Magic sword +2", 20);
		Item shield = new Item("Normal shield", 40);
		p.addItem(sword);
		p.addItem(shield);
		if (p.getEncumbrance() != 60) throw new RuntimeException("getEncumbrance() should be 60, not " + p.getEncumbrance());
		p.collectMoney(10,2,0,40,2);
		if (p.getEncumbrance() != 60+54) throw new RuntimeException("getEncumbrance() should be 114, not " + p.getEncumbrance());
		if (p.getMoneyValue() != 50.3) throw new RuntimeException("getMoneyValue() should be 50.3, not " + p.getMoneyValue());
		p.collectMoney(0,0,0,6,0);
		if (p.getEncumbrance() != 120) throw new RuntimeException("getEncumbrance() should be 120, not " + p.getEncumbrance());
		if (p.getRunningSpeed() != 4.4) throw new RuntimeException("getRunningSpeed() should be 4.4, not " + p.getRunningSpeed());
		System.out.println("All tests passed.");
	}


}