/******************************************************************************
*
* Bagels
*
* From: BASIC Computer Games (1978)
*       Edited by David H. Ahl
*
* "In this game, the computer picks a 3-digit secret number using
*  the digits 0 to 9 and you attempt to guess what it is.  You are
*  allowed up to twenty guesses.  No digit is repeated.  After
*  each guess the computer will give you clues about your guess
*  as follows:
*
*  PICO     One digit is correct, but in the wrong place
*  FERMI    One digit is in the correct place
*  BAGELS   No digit is correct
*
* "You will learn to draw inferences from the clues and, with
*  practice, you'll learn to improve your score.  There are several
*  good strategies for playing Bagels.  After you have found a good
*  strategy, see if you can improve it.  Or try a different strategy
*  altogether and see if it is any better.  While the program allows
*  up to twenty guesses, if you use a good strategy it should not
*  take more than eight guesses to get any number.
*
* "The original authors of this program are D. Resek and P. Rowe of
*  the Lawrence Hall of Science, Berkeley, California."
*
* Java port by Jeff Jetton, 2020, based on an earlier Python port
*
******************************************************************************/

import java.util.Scanner;

public class Bagels {

  public static void main(String[] args) {

    int gamesWon = 0;

    // Intro text
    System.out.println("\n\n                Bagels");
    System.out.println("Creative Computing  Morristown, New Jersey");
    System.out.println("\n\n");
    System.out.print("Would you like the rules (Yes or No)? ");

    // Need instructions?
    Scanner scan = new Scanner(System.in);
    String s = scan.nextLine();
    if (s.length() == 0 || s.toUpperCase().charAt(0) != 'N') {
      System.out.println();
      System.out.println("I am thinking of a three-digit number.  Try to guess");
      System.out.println("my number and I will give you clues as follows:");
      System.out.println("   PICO   - One digit correct but in the wrong position");
      System.out.println("   FERMI  - One digit correct and in the right position");
      System.out.println("   BAGELS - No digits correct");
    }

    // Loop for playing multiple games
    boolean stillPlaying = true;
    while(stillPlaying) {

      // Set up a new game
      BagelGame game = new BagelGame();
      System.out.println("\nO.K.  I have a number in mind.");

      // Loop guess and responsses until game is over
      while (!game.isOver()) {
        String guess = getValidGuess(game);
        String response = game.makeGuess(guess);
        // Don't print a response if the game is won
        if (!game.isWon()) {
          System.out.println(response);
        }
      }

      // Game is over. But did we win or lose?
      if (game.isWon()) {
        System.out.println("You got it!!!\n");
        gamesWon++;
      } else {
        System.out.println("Oh well");
        System.out.print("That's " + BagelGame.MAX_GUESSES + " guesses.  ");
        System.out.println("My number was " + game.getSecretAsString());
      }

      stillPlaying = getReplayResponse();
    }

    // Print goodbye message
    if (gamesWon > 0) {
      System.out.println("\nA " + gamesWon + " point Bagels buff!!");
    }
    System.out.println("Hope you had fun.  Bye.\n");
  }

  private static String getValidGuess(BagelGame game) {
    // Keep asking for a guess until valid
    Scanner scan = new Scanner(System.in);
    boolean valid = false;
    String guess = "";
    String error;

    while (!valid) {
      System.out.print("Guess # " + game.getGuessNum() + "     ? ");
      guess = scan.nextLine().trim();
      error = game.validateGuess(guess);
      if (error == "") {
        valid = true;
      } else {
        System.out.println(error);
      }
    }
    return guess;
  }

  private static boolean getReplayResponse() {
    // keep asking for response until valid
    Scanner scan = new Scanner(System.in);
    // Keep looping until a non-zero-length string is entered
    while (true) {
      System.out.print("Play again (Yes or No)? ");
      String response = scan.nextLine().trim();
      if (response.length() > 0) {
        return response.toUpperCase().charAt(0) == 'Y';
      }
    }
  }

}
