/**
 * A SysInventory object keeps track of computer systems for a department
 *
 * @see SystemInventoryMain
 * @see ITSystem
 */

import java.util.Scanner;

public class SysInventory
{
    private String name;             // the name of this SysInventory 
    private Scanner scanner;         // for getting input from the user   
    private ITSystem [] systems;     // the systems we're tracking
    private static final String HELPSTRING =
 "Actions: exit, help, print, record-problem, in-same-room, move";

    /**
     * Construct a SysInventory with the given name.
     * @param name the name of the SysInventory.
     */
    
    public SysInventory( String name )
    {
        this.name = name;
    }
    
    /**
     * open the SysInventory: get it set up with IT systems
     * @param input for user input.
     */
    public void open( Scanner input)
    {
        scanner = input;
        System.out.println( "Welcome to " + name );
        
        // Construct ITSystems systems. (Eventually replace by reading a file)
        int n = promptInt( "Enter how many systems: " );
        systems = new ITSystem[n + 1];  // avoid "system 0"
        for (int id = 1; id <= n; id++) {
          int r = promptInt( "Enter the system's room no: " );
          systems[id] = new ITSystem( id, r , 0 );  // assume 0 problems to start
          System.out.println(" System is assigned number " + id);  
        }   
    }
    
     /**
     * process commands for the SysInventory
     * 
     */
    public void doCommands() {
      while ( true ) {
        ITSystem sys = whichITSystem();
        if ( sys == null ) {
          break; // all done
        }
        else {
          processActionsForITSystem(sys);
        }
      }       
      System.out.println( "Goodbye from " + name );
    }

    // Prompt the user for an system number and return the
    // corresponding ITSystem object. Return null when
    // the user is done.

    private ITSystem whichITSystem()
    {
      while (true) {
        System.out.print("Enter system inventory number, room <n>, or 0 to quit: ");
        if (scanner.hasNextInt() == true){
          int  idNumber = scanner.nextInt();
          if (idNumber > 0 && idNumber < systems.length) {
            return systems[idNumber];  // found matching id
          }
          else if ( idNumber == 0 ) {
            return null;  // user says to quit
          }
          else {
            System.out.println( "No system numbered " + 
                               idNumber + "; try again." );
          }
        }
        else {
          //System.out.println("Bing");
          String check = scanner.next();
          //System.out.println(check);
          if (check.equals("room")){
            //System.out.println("Bam");
            int r = scanner.nextInt();
            // count systems with this room number
            int count = 0;
            for (int i = 1; i < systems.length; i++){
              if (systems[i].getRoomNo() == r){
                count++;
              }
            }
            if (count == 0){
              System.out.println("No system in this room. Try again");
            }
            else if (count == 1){
              //System.out.println("Boom");
              for (int i = 1; i < systems.length; i++){
                if (systems[i].getRoomNo() == r){
                  return systems[i];
                }
              }
            }
    else { // case of multiple systems in room r
        while (true){
     System.out.println("Room " + r + " has " + count + " systems.");
     for (int i = 1; i < systems.length; i++){
         if (systems[i].getRoomNo() == r){
      System.out.println(systems[i].toString());
         }
     }
     int  idNumber = 
         promptInt(
     "Enter system inventory number from above list, 0 to quit: ");
     if (idNumber > 0 && idNumber < systems.length) {
         return systems[idNumber];  // found matching id
     }
     else if ( idNumber == 0 ) {
         return null;  // user says to quit
     }
     else {
         System.out.println( "No system numbered " + 
        idNumber + "; try again." );
     }
        }
    }
       }
   }
      }
    }

    // Prompt the user for action to process.
    // and do it,

    private void processActionsForITSystem( ITSystem system) 
    {
        System.out.println("System " + system.getId() + " selected");
        System.out.println( HELPSTRING );
        
        boolean moreActions = true;
        while ( moreActions ) {
            String command = prompt( "Enter action: " );
            if ( command.equals( "exit" ) ) {
                moreActions = false;
            }
            else if ( command.equals( "help" ) ) {
                System.out.println( HELPSTRING );
            }
            else if ( command.equals( "print" ) ) {
                System.out.println(system.toString());  // calls toString()
            }
            else if ( command.equals( "record-problem" ) ) {
                system.recordProblem( );
                System.out.println("The system now has " + system.getProblemCount() +
       " recorded problems");
            }
     else if (command.equals("in-same-room")){
  System.out.println("Systems in same room as System " + system.getId() +
       ":");
  int room = system.getRoomNo(); 
  for (int id = 1; id < systems.length; id++){
      if (systems[id].getRoomNo() == room){
   System.out.println(systems[id].toString());
      }
  }
     }
     else if (command.equals("move")){
  int oldr = system.getRoomNo();
  int r = promptInt("Enter room for system " + system.getId() +
      " to move to: ");
  while (oldr == r){
      System.out.println("System " + system.getId() +
           " is already in this room.");
      r = promptInt("Enter room for system " + system.getId() + 
      " to move to: ");
  }
  System.out.println("Systems now in old room " + oldr + ":");
  system.changeRoomNo(r);
  int count = 0;
  for (int id = 1; id < systems.length; id++){
                    if (systems[id].getRoomNo() == oldr){
                        System.out.println(systems[id].toString());
   count++;
                    }
                }
  if (count == 0){
      System.out.println("none");
  }
                System.out.println("Systems now in new room " + r + ":");
                for (int id = 1; id < systems.length; id++){
                    if (systems[id].getRoomNo() == r){
                        System.out.println(systems[id].toString());
                    }
                }
     }
            else{
                System.out.println("sorry, unknown action" );
            }
        }
    }
   
    // helper methods using the private Scanner  
    private String prompt( String prompt) {
        System.out.print(prompt);
        return scanner.next();
    }

    private int promptInt( String prompt) {
        System.out.print(prompt);
        return scanner.nextInt();
    }
}


