package tmcsim.client.cadclientgui.screens;

import java.awt.Color;
import static java.awt.Component.LEFT_ALIGNMENT;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

/**
 * This class contains the view and controller for the Login screen. The view
 * was not built using a GUI builder plug-in (but may want to consider doing so
 * in the future), and the controller uses listeners to control how the view and
 * data act.
 *
 * @author Vincent
 */
public class Login extends JFrame implements KeyListener
{
    private Box login;
    private JTextField userNameField;
    private JTextField passwordField;
    public static String kNamePrompt = "Enter your name";

    public Login()
    {
        initView();
    }

    private ActionListener newEnterActionListener()
    {
        return new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                setVisible(false);
                // Check if user provided a username JD
                String userEntry = userNameField.getText();
                if (userEntry.equals(kNamePrompt))
                {
                    ScreenManager.setUserName("Anonymous Trainee");
                }
                else
                {
                    ScreenManager.setUserName(userEntry);
                }
                ScreenManager.openCADMenu();
                ScreenManager.openAssignedIncidents();
                ScreenManager.openUnitStatus();
                ScreenManager.openPendingIncidents();
                ScreenManager.openPowerlineUI();
                if (!passwordField.getText().equals("Dispatcher"))
                {
                    ScreenManager.setDispatcherAuthority(false);
                }
            }
        };
    }

    private ActionListener newExitActionListener()
    {
        return new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        };
    }

    private void initView()
    {
        login = new Box(BoxLayout.Y_AXIS);
        login.setAlignmentX(LEFT_ALIGNMENT);
        JPanel whiteBackground = new JPanel();
        whiteBackground.setAlignmentX(LEFT_ALIGNMENT);
        whiteBackground.setBackground(Color.WHITE);
        whiteBackground.setMaximumSize(new Dimension(750, 150));
        whiteBackground.setMinimumSize(new Dimension(750, 150));
        whiteBackground.setPreferredSize(new Dimension(750, 150));
        login.add(whiteBackground);

        JPanel blueBackground = new JPanel();
        blueBackground.setAlignmentX(LEFT_ALIGNMENT);
        blueBackground.setBackground(new Color(50, 150, 200));
        blueBackground.setMaximumSize(new Dimension(750, 350));
        blueBackground.setMinimumSize(new Dimension(750, 350));
        blueBackground.setPreferredSize(new Dimension(750, 350));

        JLabel title = new JLabel();
        // Check if we are running from a jar to put message from manifest into title
        Package clientpkg = Login.class.getPackage();
        String builddate = clientpkg.getImplementationVersion();
        String version = "";
        if (builddate != null)
        {
            version = "          (build " + builddate + ")";
        }
        else // We're running from a dev environment
        {
            version = "           00-00-00 00:00";
        }

        title.setText("Inform CAD 5.3 Patch 5 ");
        title.setHorizontalAlignment(SwingConstants.CENTER);
        title.setFont(new Font("Arial", Font.PLAIN, 22));
        title.setForeground(Color.WHITE);
        title.setMaximumSize(new Dimension(750, 100));
        title.setMinimumSize(new Dimension(750, 100));
        title.setPreferredSize(new Dimension(750, 100));
        blueBackground.add(title);

        JLabel builddateLabel = new JLabel(version);
        builddateLabel.setForeground(Color.WHITE);
        builddateLabel.setHorizontalAlignment(SwingConstants.CENTER);
        blueBackground.add(builddateLabel);

        Box leftBox = new Box(BoxLayout.Y_AXIS);
        leftBox.setMaximumSize(new Dimension(350, 90));
        leftBox.setMinimumSize(new Dimension(350, 90));
        leftBox.setPreferredSize(new Dimension(350, 90));
        leftBox.setAlignmentX(LEFT_ALIGNMENT);

        JLabel userNameLabel = new JLabel("User name ");
        userNameLabel.setForeground(Color.WHITE);
        userNameField = new JTextField(kNamePrompt);
        userNameField.addKeyListener(this);
        userNameField.setForeground(Color.GRAY);
        Box userNameBox = new Box(BoxLayout.X_AXIS);
        userNameBox.setAlignmentX(LEFT_ALIGNMENT);
        userNameBox.add(Box.createHorizontalStrut(10));
        userNameBox.add(userNameLabel);
        userNameBox.add(userNameField);
        leftBox.add(userNameBox);

        JLabel passwordLabel = new JLabel("Password  ");
        passwordLabel.setForeground(Color.WHITE);
        passwordField = new JTextField("Not required");
        passwordField.setEnabled(false);
        Box passwordBox = new Box(BoxLayout.X_AXIS);
        passwordBox.setAlignmentX(LEFT_ALIGNMENT);
        passwordBox.add(Box.createHorizontalStrut(10));
        passwordBox.add(passwordLabel);
        passwordBox.add(passwordField);
        leftBox.add(Box.createVerticalStrut(10));
        leftBox.add(passwordBox);

        JButton enter = new JButton("Login");
        enter.addActionListener(newEnterActionListener());
        JButton newPassword = new JButton("New Password");
        newPassword.setEnabled(false);
        JButton exit = new JButton("Exit");
        exit.addActionListener(newExitActionListener());
        JButton selectAll = new JButton("Select All");
        selectAll.setEnabled(false);
        JButton unselectAll = new JButton("Unselect all");
        unselectAll.setEnabled(false);
        Box buttonBox = new Box(BoxLayout.X_AXIS);
        buttonBox.setAlignmentX(LEFT_ALIGNMENT);
        buttonBox.add(Box.createHorizontalStrut(75));
        buttonBox.add(enter);
        buttonBox.add(Box.createHorizontalStrut(20));
        buttonBox.add(newPassword);
        buttonBox.add(Box.createHorizontalStrut(20));
        buttonBox.add(exit);
        buttonBox.add(Box.createHorizontalStrut(125));
        buttonBox.add(selectAll);
        buttonBox.add(Box.createHorizontalStrut(10));
        buttonBox.add(unselectAll);

        Box rightBox = new Box(BoxLayout.Y_AXIS);
        rightBox.setAlignmentX(LEFT_ALIGNMENT);
        rightBox.setMaximumSize(new Dimension(250, 90));
        rightBox.setMinimumSize(new Dimension(250, 90));
        rightBox.setPreferredSize(new Dimension(250, 90));
        JLabel position = new JLabel("Positions:");
        position.setPreferredSize(new Dimension(250, 20));
        position.setMaximumSize(new Dimension(250, 20));
        position.setMinimumSize(new Dimension(250, 20));
        position.setBackground(Color.BLACK);
        position.setHorizontalAlignment(SwingConstants.LEFT);
        position.setForeground(Color.WHITE);
        rightBox.add(position);
        JPanel list = new JPanel();
        rightBox.add(list);

        Box centerBox = new Box(BoxLayout.X_AXIS);
        centerBox.setAlignmentX(LEFT_ALIGNMENT);
        centerBox.add(leftBox);
        centerBox.add(Box.createHorizontalStrut(75));
        centerBox.add(rightBox);
        blueBackground.add(centerBox);
        blueBackground.add(Box.createVerticalStrut(125));
        blueBackground.add(buttonBox);
        login.add(blueBackground);

        getContentPane().add(login);
        setUndecorated(true);
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    /** 
     * This keylistener removes the prompt displayed in the username text box
     * the first time the user presses a key.  Fixes #96
     * @author jdalbey
     * @param evt 
     */
    public void keyPressed(KeyEvent evt) 
    {
        // See if the text in the box is the initial prompt
        // If so, the user hasn't typed anything yet, this is the 1st keypress
        // Even the shift key will be caught here.
        if (userNameField.getText().equals(kNamePrompt))
        {
            userNameField.setText("");
            // Change the text color from gray to black
            userNameField.setForeground(Color.BLACK);
        }
    }

    public void keyReleased(KeyEvent e) {}
    public void keyTyped(KeyEvent e) {}
}
