/* File: ChangePasswordPane.java
 * Author: Jason Gookins
 * Description: Allows a standard user to change their password.
 */

import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Insets;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;

public class ChangePasswordPane extends JPanel implements ActionListener
{
	/************************
	 ** Instance Variables **
	 ************************/

	private Belief belief;
	private JPasswordField newPasswordField, confirmPasswordField;
	private JButton okayButton, cancelButton;



	/**********************
	 ** Main Constructor **
	 **********************/

	public ChangePasswordPane(Belief belief)
	{
		this.belief = belief;

		setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();

		JLabel changePasswordLabel = new JLabel("Change Password", JLabel.CENTER);
		changePasswordLabel.setFont(new Font("SansSerif", Font.PLAIN, 20));
		changePasswordLabel.setPreferredSize(new Dimension(200, 60));
		c.gridx = 0;
		c.gridy = 0;
		c.gridwidth = 2;
		c.gridheight = 1;
		c.fill = GridBagConstraints.BOTH;
		add(changePasswordLabel, c);

		JPanel inputPanel = new JPanel(new GridBagLayout());
		GridBagConstraints d = new GridBagConstraints();

		JLabel newPasswordLabel = new JLabel("New Password:");
		d.gridx = 0;
		d.gridy = 0;
		d.insets = new Insets(0, 0, 5, 5);
		d.fill = GridBagConstraints.NONE;
		inputPanel.add(newPasswordLabel, d);

		JLabel confirmPasswordLabel = new JLabel("Confirm Password:");
		d.gridy = 1;
		d.insets = new Insets(5, 0, 0, 5);
		inputPanel.add(confirmPasswordLabel, d);

		newPasswordField = new JPasswordField();
		newPasswordField.setPreferredSize(new Dimension(200, 20));
		newPasswordField.setMinimumSize(new Dimension(200, 20));
		newPasswordField.addActionListener(this);
		d.gridx = 1;
		d.gridy = 0;
		d.insets = new Insets(0, 10, 5, 5);
		d.fill = GridBagConstraints.BOTH;
		inputPanel.add(newPasswordField, d);

		confirmPasswordField = new JPasswordField();
		confirmPasswordField.setPreferredSize(new Dimension(200, 20));
		confirmPasswordField.setMinimumSize(new Dimension(200, 20));
		confirmPasswordField.addActionListener(this);
		d.gridy = 1;
		d.insets = new Insets(5, 10, 0, 5);
		inputPanel.add(confirmPasswordField, d);

		c.gridy = 1;
		add(inputPanel, c);

		okayButton = new JButton("Okay");
		okayButton.setPreferredSize(new Dimension(75, 30));
		okayButton.setMinimumSize(new Dimension(75, 30));
		okayButton.addActionListener(this);
		c.gridy = 2;
		c.gridwidth = 1;
		c.weightx = 0.5;
		c.insets = new Insets(15, 0, 0, 5);
		c.fill = GridBagConstraints.NONE;
		c.anchor = GridBagConstraints.EAST;
		add(okayButton, c);

		cancelButton = new JButton("Cancel");
		cancelButton.setPreferredSize(new Dimension(75, 30));
		cancelButton.setMinimumSize(new Dimension(75, 30));
		cancelButton.addActionListener(this);
		c.gridx = 1;
		c.insets = new Insets(15, 5, 0, 0);
		c.anchor = GridBagConstraints.WEST;
		add(cancelButton, c);
	}



	/***************
	 ** Accessors **
	 ***************/

	public JPasswordField getNewPasswordField()
	{
		return this.newPasswordField;
	}



	/*******************
	 ** Action Events **
	 *******************/

	public void actionPerformed(ActionEvent evt)
	{
		if (evt.getSource().equals(newPasswordField))
		{
			confirmPasswordField.requestFocus();
		}
		else if (evt.getSource().equals(okayButton) || evt.getSource().equals(confirmPasswordField))
		{
			try
			{
				changePassword();
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
		else if (evt.getSource().equals(cancelButton))
		{
			returnToUserChoicePane();
		}
	}



	/**********************
	 ** Instance Methods **
	 **********************/

	private void changePassword() throws Exception
	{
		String newPassword = new String(newPasswordField.getPassword());
		String confirmedPassword = new String(confirmPasswordField.getPassword());

		if (!newPassword.equals(confirmedPassword))
		{
			ChangePasswordDialog errorDialog = new ChangePasswordDialog("New Password Error", "error", new JOptionPane("New password and confirmed password do not match. Please try again.", JOptionPane.ERROR_MESSAGE));
		}
		else
		{
			Class.forName("org.sqlite.JDBC");
			Connection conn = DriverManager.getConnection("jdbc:sqlite:belief.db");

			conn.createStatement().execute("UPDATE users SET pass = '" + confirmedPassword + "' WHERE name = '" + belief.getCurrentUser() + "'");
			conn.close();

			ChangePasswordDialog successDialog = new ChangePasswordDialog("Password Changed", "success", new JOptionPane("Password changed successfully.", JOptionPane.INFORMATION_MESSAGE));
		}
	}

	private void returnToUserChoicePane()
	{
		CardLayout mainLayout = (CardLayout)belief.getContentPane().getLayout();

		clearFields();

		mainLayout.show(belief.getContentPane(), "userChoicePane");
	}

	private void logOut()
	{
		CardLayout mainLayout = (CardLayout)belief.getContentPane().getLayout();

		clearFields();

		mainLayout.show(belief.getContentPane(), "loginPane");
		belief.getLoginPane().getUsernameTextField().requestFocus();
	}

	private void clearFields()
	{
		newPasswordField.setText(null);
		confirmPasswordField.setText(null);
		newPasswordField.requestFocus();
	}



	/**********************
	 ** Internal Classes **
	 **********************/

	private class ChangePasswordDialog extends InternalModalDialog
	{
		private String type;

		public ChangePasswordDialog(String title, String type, JOptionPane pane)
		{
			super(title, belief, pane);

			this.type = type;
		}

		public void cleanUpAfterClosing()
		{
			if (type.equals("error"))
			{
				clearFields();
				newPasswordField.requestFocus();
			}
			else if (type.equals("success"))
			{
				logOut();
			}
		}
	}
}