package hangman.game;

import hangman.util.ConsoleReader;
import hangman.util.DisplayWord;
import hangman.util.HangmanDictionary;


/**
 * This class represents the traditional word-guessing game of Hangman between:
 *  - an interactive guesser
 *  - a secret word keeper that chooses a random secret word
 *
 * @author Robert C. Duvall
 */
public class HangmanInteractiveGame_Original {
    // constants
    public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";

    // word that is being guessed
    private String mySecretWord;
    // how many guesses are remaining
    private int myNumGuessesLeft;
    // what is shown to the user
    private DisplayWord myDisplayWord;
    // tracks letters guessed
    private StringBuilder myLettersLeftToGuess;


    /**
     * Create Hangman game using words of the given length chosen from the given dictionary of words
     * and giving the user the given number of chances.
     */
    public HangmanInteractiveGame_Original(HangmanDictionary dictionary, int wordLength, int numGuesses) {
        mySecretWord = dictionary.getRandomWord(wordLength).toLowerCase();
        myNumGuessesLeft = numGuesses;
        myLettersLeftToGuess = new StringBuilder(ALPHABET);
        myDisplayWord = new DisplayWord(mySecretWord);
    }

    /**
     * Play one complete game.
     */
    public void play () {
        boolean gameOver = false;
        while (!gameOver) {
            // print game status
            System.out.println();
            System.out.println(myDisplayWord);
            System.out.println(String.format("# misses left = %d", myNumGuessesLeft));
            System.out.println(String.format("letters not yet guessed = %s", myLettersLeftToGuess));
            // NOT PUBLIC, but makes it easier to test
            System.out.println(String.format("*** %s", mySecretWord));

            // handle guess
            String guess = ConsoleReader.promptString("Guess a letter: ").toLowerCase();
            if (guess.length() == 1 && Character.isAlphabetic(guess.charAt(0))) {
                int index = myLettersLeftToGuess.indexOf(guess);
                // do not count repeated guess as a miss
                if (index >= 0) {
                    System.out.println(String.format("letter guessed = %s%n", guess));
                    // record guess
                    myLettersLeftToGuess.deleteCharAt(index);
                    // update secret word based on user's guess
                    char letter = guess.charAt(0);
                    // check for guess in secret word
                    if (mySecretWord.indexOf(letter) >= 0) {
                        myDisplayWord.update(letter, mySecretWord);
                        myNumGuessesLeft -= 1;
                    }
                }
                else {
                    System.out.println("Please enter a new letter ...");
                }
            }
            else {
                System.out.println("Please enter a single letter ...");
            }

            // check for end of game
            if (myNumGuessesLeft == 0) {
                System.out.println("YOU ARE HUNG!!!");
                gameOver = true;
            }
            else if (myDisplayWord.equals(mySecretWord)) {
                System.out.println("YOU WIN!!!");
                gameOver = true;
            }
        }
        System.out.println(String.format("The secret word was %s", mySecretWord));
    }
}
