package hangman;
/**
 * Game contains the logic for game of hangman.
 * 
 */
public class Game {

    protected String word;
    protected int remaining_guesses;
    protected StringBuffer display;
    protected String correctGuess;
    protected String badGuess;

    /**
     * Game constructor
     * @param word - the word to be guessed
     * @param guesses - number of incorrect guesses allowed
     */
    public Game(String word, int guesses) {
        this.word = word;
        remaining_guesses = guesses;
        correctGuess = "";
        badGuess = "";
        display = new StringBuffer();
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (Character.isLetter(c)) {
                display.append("_");
            } else {
                display.append("#");
            }
            display.append(" ");
        }
    }

    public String getWord() {
        return word;
    }

    public int getRemainingGuesses() {
        return remaining_guesses;
    }

    public String getDisplay() {
        return display.toString();
    }

    /* return code from processGuess */
    
    public static final int GOOD = 1;
    public static final int BAD = 2;
    public static final int WON = 3;
    public static final int LOST = 4;
    public static final int REPEAT_GOOD_GUESS = 5;
    public static final int REPEAT_BAD_GUESS = 6;

    /**
     * 
     * @param c - the letter guessed
     * @return code
     */
    public int processGuess(char c) {
        if (correctGuess.indexOf(c) >= 0) {
            return REPEAT_GOOD_GUESS;
        }

        if (badGuess.indexOf(c) >= 0) {
            remaining_guesses -= 1;
            if (remaining_guesses <= 0 && display.indexOf("_") >= 0) {
                return LOST;
            } else {
                return REPEAT_BAD_GUESS;
            }

        } else {
            boolean found = false;
            for (int i = 0; i < word.length(); i++) {
                if (c == word.charAt(i)) {
                    found = true;
                    correctGuess += c;
                    display.replace(2 * i, 2 * i + 1, word.substring(i, i + 1));
                }
            }
            if (!found) {
                remaining_guesses -= 1;
                badGuess += c;
                if (remaining_guesses <= 0 && display.indexOf("_") >= 0) {
                    return LOST;
                } else {
                    return BAD;
                }
            }
        }

        if (display.indexOf("_") < 0) {
            return WON;
        } else {
            return GOOD;
        }
    }

    /**
     * user asks for a hint.
     * @return code WON, LOST or GOOD.
     */
    public int doHint() {
        int k = display.indexOf("_");
        char c = word.charAt(k / 2);
        int rc = processGuess(c);
        return rc;
    }
}
