/* File: DeleteUserPane.java
 * Author: Jason Gookins
 * Description: Allows an admin to delete an existing user.
 */

import java.awt.CardLayout;
import java.awt.Color;
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 java.util.ArrayList;
import java.util.Collections;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;

public class DeleteUserPane extends JPanel implements ActionListener
{
	/************************
	 ** Instance Variables **
	 ************************/

	private Belief belief;
	private DefaultListModel userList;
	private JList userListDisplay;
	private JButton selectButton, removeButton, okayButton, cancelButton;
	private JLabel userLabel;



	/**********************
	 ** Main Constructor **
	 **********************/

	public DeleteUserPane(Belief belief)
	{
		this.belief = belief;

		setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();

		JLabel deleteUserLabel = new JLabel("Delete User", JLabel.CENTER);
		deleteUserLabel.setFont(new Font("SansSerif", Font.PLAIN, 20));
		deleteUserLabel.setPreferredSize(new Dimension(200, 60));
		c.gridx = 0;
		c.gridy = 0;
		c.gridwidth = 2;
		c.gridheight = 1;
		c.fill = GridBagConstraints.BOTH;
		add(deleteUserLabel, c);

		JLabel usersLabel = new JLabel("Users:");
		c.gridy = 1;
		c.fill = GridBagConstraints.NONE;
		add(usersLabel, c);

		JPanel usersPanel = new JPanel(new GridBagLayout());
		usersPanel.setPreferredSize(new Dimension(360, 125));
		usersPanel.setMinimumSize(new Dimension(360, 125));
		GridBagConstraints d = new GridBagConstraints();

		JPanel userListPanel = new JPanel(new GridBagLayout());
		GridBagConstraints e = new GridBagConstraints();

		userList = new DefaultListModel();
		userListDisplay = new JList(userList);
		userListDisplay.setLayoutOrientation(JList.HORIZONTAL_WRAP);
		userListDisplay.setPrototypeCellValue("12345678901");
		userListDisplay.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		userListDisplay.setVisibleRowCount(-1);
		e.weightx = 1.0;
		e.weighty = 1.0;
		e.fill = GridBagConstraints.BOTH;
		userListPanel.add(userListDisplay, e);

		JScrollPane userListScrollPane = new JScrollPane(userListPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		d.weightx = 1.0;
		d.weighty = 1.0;
		d.insets = new Insets(5, 5, 5, 5);
		d.fill = GridBagConstraints.BOTH;
		usersPanel.add(userListScrollPane, d);

		c.gridy = 2;
		add(usersPanel, c);

		selectButton = new JButton("v  v  v");
		selectButton.setMargin(new Insets(0, 0, 0, 0));
		selectButton.setPreferredSize(new Dimension(75, 30));
		selectButton.setMinimumSize(new Dimension(75, 30));
		selectButton.addActionListener(this);
		c.gridy = 3;
		c.gridwidth = 1;
		c.weightx = 0.5;
		c.insets = new Insets(5, 0, 5, 5);
		c.anchor = GridBagConstraints.EAST;
		add(selectButton, c);

		removeButton = new JButton("^  ^  ^");
		removeButton.setEnabled(false);
		removeButton.setMargin(new Insets(0, 0, 0, 0));
		removeButton.setPreferredSize(new Dimension(75, 30));
		removeButton.setMinimumSize(new Dimension(75, 30));
		removeButton.addActionListener(this);
		c.gridx = 1;
		c.insets = new Insets(5, 5, 5, 0);
		c.anchor = GridBagConstraints.WEST;
		add(removeButton, c);

		userLabel = new JLabel();
		userLabel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.BLACK), BorderFactory.createEmptyBorder(0, 3, 0, 3)));
		userLabel.setBackground(Color.WHITE);
		userLabel.setPreferredSize(new Dimension(200, 20));
		userLabel.setMinimumSize(new Dimension(200, 20));
		c.gridx = 0;
		c.gridy = 4;
		c.gridwidth = 2;
		c.insets = new Insets(10, 5, 5, 5);
		c.anchor = GridBagConstraints.CENTER;
		add(userLabel, c);

		okayButton = new JButton("Okay");
		okayButton.setEnabled(false);
		okayButton.setPreferredSize(new Dimension(75, 30));
		okayButton.setMinimumSize(new Dimension(75, 30));
		okayButton.addActionListener(this);
		c.gridy = 5;
		c.gridwidth = 1;
		c.insets = new Insets(10, 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(10, 5, 0, 0);
		c.anchor = GridBagConstraints.WEST;
		add(cancelButton, c);
	}



	/*******************
	 ** Action Events **
	 *******************/

	public void actionPerformed(ActionEvent evt)
	{
		if (evt.getSource().equals(selectButton))
		{
			selectUser();
		}
		else if (evt.getSource().equals(removeButton))
		{
			removeUser();
		}
		else if (evt.getSource().equals(okayButton))
		{
			DeleteUserDialog deleteUserDialog = new DeleteUserDialog("Belief", "certainty", new JOptionPane("Are you sure you want to delete this user?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION));
		}
		else if (evt.getSource().equals(cancelButton))
		{
			returnToAdminChoicePane();
		}
	}



	/**********************
	 ** Instance Methods **
	 **********************/

	public void initialize()
	{
		try
		{
			Class.forName("org.sqlite.JDBC");
			Connection conn = DriverManager.getConnection("jdbc:sqlite:belief.db");
			Statement statement = conn.createStatement();
			ResultSet rs = statement.executeQuery("SELECT name FROM users");
			ArrayList<String> users = new ArrayList<String>();

			while (rs.next())
			{
				String username = rs.getString("name");

				if (!username.equals(belief.getCurrentUser()))
				{
					users.add(rs.getString("name"));
				}
			}

			rs.close();
			conn.close();

			Collections.sort(users);

			userList = new DefaultListModel();

			for (int i = 0; i < users.size(); i++)
			{
				userList.addElement(users.get(i));
			}

			userListDisplay.setModel(userList);
			userListDisplay.setEnabled(true);

			selectButton.setEnabled(true);
			removeButton.setEnabled(false);
			userLabel.setText(null);
			okayButton.setEnabled(false);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	private void selectUser()
	{
		if (userListDisplay.getSelectedIndex() > -1)
		{
			String user = (String)userListDisplay.getSelectedValue();
			int index = userList.indexOf(user);

			userListDisplay.setEnabled(false);
			userList.remove(index);
			selectButton.setEnabled(false);
			removeButton.setEnabled(true);
			userLabel.setText(user);
			okayButton.setEnabled(true);
		}
	}

	private void removeUser()
	{
		String user = userLabel.getText();
		ArrayList<String> users = new ArrayList<String>();

		for (int i = 0; i < userList.size(); i++)
		{
			users.add((String)userList.get(i));
		}
		users.add(user);

		Collections.sort(users);

		userList = new DefaultListModel();

		for (int i = 0; i < users.size(); i++)
		{
			userList.addElement(users.get(i));
		}

		userListDisplay.setModel(userList);

		userListDisplay.setEnabled(true);
		selectButton.setEnabled(true);
		removeButton.setEnabled(false);
		userLabel.setText(null);
		okayButton.setEnabled(false);
	}

	private void deleteUser()
	{
		try
		{
			String user = userLabel.getText();
			Class.forName("org.sqlite.JDBC");
			Connection conn = DriverManager.getConnection("jdbc:sqlite:belief.db");
			Statement stat = conn.createStatement();

			stat.execute("DELETE FROM views WHERE network IN (SELECT name FROM networks WHERE owner = '" + user + "')");
			stat.execute("DELETE FROM views WHERE user = '" + user + "'");
			stat.execute("SELECT 'DROP TABLE' || name || ';' from sqlite_master WHERE type = 'table' AND name GLOB (SELECT name FROM networks WHERE owner = '" + user + "') ORDER BY 1");
			stat.execute("DELETE FROM networks WHERE owner = '" + user + "'");
			stat.execute("DELETE FROM users WHERE name = '" + user + "'");
			conn.close();

			DeleteUserDialog deleteUserDialog = new DeleteUserDialog("Belief", "success", new JOptionPane("User deleted successfully.", JOptionPane.INFORMATION_MESSAGE));
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	private void returnToAdminChoicePane()
	{
		CardLayout mainLayout = (CardLayout)belief.getContentPane().getLayout();

		mainLayout.show(belief.getContentPane(), "adminChoicePane");
	}



	/**********************
	 ** Internal Classes **
	 **********************/

	private class DeleteUserDialog extends InternalModalDialog
	{
		private String type;
		private JOptionPane pane;

		public DeleteUserDialog(String title, String type, JOptionPane pane)
		{
			super(title, belief, pane);

			this.type = type;
			this.pane = pane;
		}

		public void cleanUpAfterClosing()
		{
			if (type.equals("certainty"))
			{
				if (pane.getValue().equals(JOptionPane.YES_OPTION))
				{
					deleteUser();
				}
			}
			else if (type.equals("success"))
			{
				returnToAdminChoicePane();
			}
		}
	}
}