import javabook.*;

/**
 * This class is the top-level controller object for managing
 * all other objects in the HiLo program.
 *
 * @author Dr. Caffeine
 *
 */
class HiLo        // Step 4: Final Version
{

//--------------------------------
//  Data Members
//--------------------------------
  
  private final int        MAX_GUESS_ALLOWED       = 6;

  private MainWindow       mainWindow;
  private MessageBox       messageBox;
  private OutputBox        outputBox; 
  private ResponseBox      responseBox;
  private InputBox         inputBox;
  
  private int              secretNumber;  

//--------------------------------
//  Constructors
//--------------------------------
  
  /**
   * Default constructor. The default window title is "Drawing Shape".
   */
  public HiLo( )
  {
      mainWindow    = new MainWindow  ("Let’s Play HiLo");
      outputBox     = new OutputBox   ( mainWindow );
      responseBox   = new ResponseBox ( mainWindow );
      messageBox    = new MessageBox  ( mainWindow );
      inputBox      = new InputBox    ( mainWindow );
    
      mainWindow.setVisible( true );
      outputBox.setVisible( true );
  }    

//-------------------------------------------------
//    Public Methods:
// 
//      void    start    (    )
//
//------------------------------------------------
  
  /**
   * Top level method that calls other private methods
   * to play the Hi-Lo games.   
   */
  public void start ( )
  {
      int answer;
      
      describeRules();
  
      answer = responseBox.prompt("Do you want to play a Hi-Lo game?");
  
      while ( answer == ResponseBox.YES ) {
  
          generateSecretNumber( );
    
          playGame();
    
          answer = responseBox.prompt
                               ("Do you want to play another Hi-Lo game?");
    }
  }

//-------------------------------------------------
//    Private Methods:
// 
//    void    describeRules         (      )
//    void    generateSecretNumber  (      )
//    void    playGame              (      )
//
//------------------------------------------------
  
  /**
   * Provides a brief explanation of the program to the user.   
   *
   */    
  private void describeRules( )
  {
      //outputBox.printLine("Inside describeRules");         //TEMP
    
      /* 
          Completion of this method is left as an exercise, see
          Exercise 7.15.
          
          Describe the game rules only if the player replied
          YES to the program's prompt. Use ResponseBox for
          prompting the player. The following is a sample
          description:
          
               The objective of this HiLo game is for you to guess
               the secret number (any integer between 1 and 100) with 
               the least number of tries.  The maximum number of tries 
               allowed is six. If your guess is higher than the
               secret number, the program will reply HI. If your
               guess is lower, the program will reply LO. 
             
       */
  }

  /**
   * Generates a random number between 1 and 100.   
   *
   */  
  private void generateSecretNumber( )
  {
      double X = Math.random();
  
      secretNumber = (int) Math.floor( X * 100 ) + 1;

  //  System.out.println("Secret Number: " + secretNumber); //TEMP
                              
  }
  
  
  /**
   * Plays one Hi-Lo game.   
   *
   */  
  private void playGame( )
  {
    
      int guessCount = 0;
      int guess;
    
      do {
          //get the next guess
          guess = getNextGuess();
      
          guessCount++;
      
          //check the guess
          if (guess < secretNumber) {
              messageBox.show("Your guess is LO");
          }
          else if (guess > secretNumber) {
              messageBox.show("Your guess is HI");
          }
    
      } while ( guessCount < MAX_GUESS_ALLOWED &&                         
                 guess != secretNumber );                    
    
      //output appropriate message
      if ( guess == secretNumber ) {
          messageBox.show("You guessed it in " 
                  + guessCount  + " tries.");
      }
      else {
          messageBox.show("You lost. Secret No. was " 
                  + secretNumber);
      }

  }
  
  /**
   * Gets the player's next guess.
   *
   * @return the next guess entered by the player
   */
  private int getNextGuess( )
  {
      int nextGuess;
      
      nextGuess = inputBox.getInteger("Enter Guess between 1 and 100");
    
      while (nextGuess < 1 || nextGuess > 100) {
          messageBox.show("Guess must be between 1 and 100");
          nextGuess = inputBox.getInteger("Your Guess:");
      }
    
  //  System.out.println("Guess: " + nextGuess); //TEMP
    
      return nextGuess;
  }
}