package gy4simpledb.gui;

import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
import gy4simpledb.dbclasses.MyServer;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.SQLException;
import javax.swing.AbstractAction;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ListSelectionListener;

public class DbFrame extends JFrame {

    private MyServer server;
    JTable hallgatokTable;
    HallgatokTableModel hallgatokTableModel;
    private JButton commitBtn, rollbackBtn;
    JList felvettKurzusokList;
    JLabel felvettKreditekLabel;
    private ListSelectionListener hallgatokTableSelectionListener;

    private DbFrame() {
        super("simple db handling");
        try {
            UIManager.setLookAndFeel(new WindowsLookAndFeel());
        } catch (UnsupportedLookAndFeelException ex) {
        }
        server = new MyServer();
        try {
            server.setProtocol("mysql");
        } catch (Exception ex) {
            showError(ex.getMessage());
            return;
        }
        setDefaults();
        while (null == server.getHostname()) {
            server.setHostname(getString("hostname of server?"));
        }
        while (null == server.getDbname()) {
            server.setDbname(getString("database name in server?"));
        }
        while (null == server.getUsername()) {
            server.setUsername(getString("username in server?"));
        }
        while (null == server.getPassword()) {
            server.setPassword(getString("password of user?", true));
        }
        try {
            server.connect();
            showInfo("connection established");
            server.fillData();
        } catch (SQLException sqlex) {
            showError(sqlex.getMessage());
            System.exit(0);
        }
        setSize(600, 400);
        addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                try {
                    server.closeConnection();
                } catch (SQLException sqlex) {
                    showError(sqlex.getMessage());
                } finally {
                    System.exit(0);
                }
            }
        });
        felvettKurzusokList = new JList();
        felvettKreditekLabel = new JLabel();

        hallgatokTableModel = new HallgatokTableModel(server);
        hallgatokTable = new JTable(hallgatokTableModel);
        hallgatokTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        hallgatokTableSelectionListener = new HallgatokTableSelectionListener(server);
        hallgatokTable.getSelectionModel().addListSelectionListener(hallgatokTableSelectionListener);
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(new JScrollPane(hallgatokTable), BorderLayout.CENTER);
        commitBtn = new JButton(commitAction);
        rollbackBtn = new JButton(rollbackAction);
        JPanel p = new JPanel(new FlowLayout());
        p.add(commitBtn);
        p.add(rollbackBtn);
        getContentPane().add(p, BorderLayout.SOUTH);
        p = new JPanel();
        p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
        p.add(new JScrollPane(felvettKurzusokList));
        p.add(felvettKreditekLabel);
        felvettKurzusokList.setPreferredSize(new Dimension(200, 100));
        getContentPane().add(p, BorderLayout.EAST);
        setVisible(true);
        //p.revalidate();
    }

    final void showError(String message) {
        JOptionPane.showMessageDialog(rootPane, message, "error", JOptionPane.ERROR_MESSAGE);
    }

    final void showInfo(String message) {
        JOptionPane.showMessageDialog(rootPane, message, "information", JOptionPane.INFORMATION_MESSAGE);
    }

    private String getString(String message) {
        return getString(message, false);
    }

    private String getString(String message, boolean password) {
        if (password) {
            showInfo("password hiding is not yet implemented, sorry :)");
        }
        return JOptionPane.showInputDialog(rootPane, message, "question", JOptionPane.QUESTION_MESSAGE);
    }

    private void setDefaults() {
        server.setHostname("localhost");
        server.setDbname("test");
        server.setUsername("test");
        server.setPassword("");
    }
    private AbstractAction commitAction = new AbstractAction("save changes") {

        public void actionPerformed(ActionEvent e) {
            setCursor(new Cursor(Cursor.WAIT_CURSOR));
            hallgatokTableModel.commitChanges();
            setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
        }
    };
    private AbstractAction rollbackAction = new AbstractAction("undo changes") {

        public void actionPerformed(ActionEvent e) {
            hallgatokTableModel.rollbackChanges();
        }
    };
    private static DbFrame dbFrameInstance = null;

    public static DbFrame getDbFrameInstance() {
        if (dbFrameInstance == null) {
            dbFrameInstance = new DbFrame();
        }
        return dbFrameInstance;
    }
}
