import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


/**
 * The Controller for a garage door opener
 *
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 */
public class Controller extends JFrame implements ActionListener
{
    private JLabel                  display;    
    private State                   state;
    private String                  entry;
    
    /**
     * Default Constructot
     */
    public Controller()
    {
       super();       
       reset();
       state = Closed.enter(this);
       performLayout();
    }

    /**
     * Handle actionPerformed messages (required by ActionListener)
     *
     * @param evt  The ActionEvent that generated the message
     */
    public void actionPerformed(ActionEvent evt)
    {
       String       ac;
       
       ac = evt.getActionCommand();
       if      (ac.equals("Close"))  state.close();
       else if (ac.equals("Lock"))   state.lock();
       else if (ac.equals("Open"))   state.open();
       else if (ac.equals("Unlock")) state.startUnlock();
       else
       {
          entry += ac;
          System.out.println(entry);
          
          if (entry.length() == 4)
          {
             if (entry.equals("1337")) state.combinationEntered();
             else                      state.errorEntered();

             reset();             
          }
       }
    }

    /**
     * Change the State of the system
     *
     * @param state   The new State
     */
    public void changeState(State state)
    {
       this.state = state;
       setMessage(state.toString());
    }

    /**
     * Reset the controller
     */
    public void reset()
    {
       entry = "";
    }

    /**
     * Layout this Controller
     */
    private void performLayout()
    {
       JButton      close, open, lock, unlock;       
       JButton[]    number;
       JPanel       center, contentPane;
       

       number = new JButton[10];       
       
       contentPane = (JPanel)getContentPane();       
       contentPane.setLayout(new BorderLayout());       

       display = new JLabel("xDoor 1337", SwingConstants.CENTER);
       contentPane.add(display, BorderLayout.NORTH);

       center = new JPanel();
       center.setLayout(new GridLayout(5,3));
       contentPane.add(center, BorderLayout.CENTER);
       for (int i=1; i<=9; i++)
       {
          number[i] = new JButton(""+i);
          center.add(number[i]);          
       }
       open = new JButton("Open");
       center.add(open);
       number[0] = new JButton("0");
       center.add(number[0]);
       close = new JButton("Close");
       center.add(close);

       unlock = new JButton("Unlock");
       center.add(unlock);
       center.add(new JLabel(" "));
       lock = new JButton("Lock");
       center.add(lock);

       for (int i=0; i<=9; i++) number[i].addActionListener(this);
       close.addActionListener(this);
       lock.addActionListener(this);
       open.addActionListener(this);
       unlock.addActionListener(this);
    }

    /**
     * Set the message on the display
     *
     * @param message   The message
     */
    public void setMessage(String message)
    {
       display.setText(message);       
    }
    
}
