package session2;

public class BowlingScoreCalculator {

	private int countFrames = 0;
	private boolean firstRoll = true;
	private int sum = 0;

	public int calculateScore(String rolls) {
		for (int rollIndex = 0; rollIndex < rolls.length() && countFrames < 10; rollIndex++) {
			char roll = rolls.charAt(rollIndex);
			if (rollIsStrike(roll)) {
				handleStrike(rolls, rollIndex);
			}
			else if (rollIsSpare(roll)) {
				handleSpare(rolls, rollIndex);
			}
			else {
				handleRegularRoll(rolls, rollIndex);
			}
		}
		return sum;
	}

	private void handleRegularRoll(String rolls, int i) {
		sum += getValueForRolls(rolls, i);
		if (firstRoll == true) {
			firstRoll = false;
		}
		else {
			countFrames++;
			firstRoll = true;
		}
	}

	private void handleSpare(String rolls, int i) {
		if (rolls.charAt(i - 1) != '-') {
			sum -= getValueForRolls(rolls, i - 1);
		}
		sum += 10;
		if (rolls.charAt(i + 1) != '-') {
			sum += getValueForRolls(rolls, i + 1);
		}
		countFrames++;
		firstRoll = true;
	}

	private boolean rollIsSpare(char roll) {
		return roll == '/';
	}

	private boolean rollIsStrike(char roll) {
		return roll == 'X';
	}

	private void handleStrike(String rolls, int i) {
		sum += 10;
		sum += getValueForRolls(rolls, i + 1);
		sum += getValueForRolls(rolls, i + 2);
		countFrames++;
		firstRoll = true;
	}

	private int getValueForRolls(String rolls, int rollIndex) {
		char roll = rolls.charAt(rollIndex);
		if (rollIsStrike(roll)) {
			return 10;
		}
		else if (roll == '-') {
			return 0;
		}
		else {
			return Integer.parseInt(roll + "");
		}
	}

}
