package carrentaldatabase.gui;

import carrentaldatabase.db.*;
import hu.elte.inf.pszt.prt.javalib.gui.tablemodel.*;
import hu.elte.inf.pszt.prt.javalib.swingapp.ElteJFrame;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;

/**
 * @author Daniel "3ICE" Berezvai
 */
public class MainFrame extends ElteJFrame {
protected final String FRAME_TITLE = "Car Rental Database";
private CarRentalDbHandler dbHandler;
private JpaControlledTableModel<Partner> partnerTableModel;
private JpaControlledTableModel<Rental> rentalTableModel;
private JpaControlledTableModel<Vehicle> vehicleTableModel;
private JTable partnerTable;
private JTable rentalTable;
private JTable vehicleTable;
private JTabbedPane tabbedPane;

@Override
public void onCreate() {
  setDefaults(FRAME_TITLE);
  setDefaultCloseOperation(DISPOSE_ON_CLOSE); // Ez már benne van a setDefaults-ban.
  dbHandler = new CarRentalDbHandler();
  dbHandler.open();
  partnerTableModel = new NonAsyncNotCachingTableModel<>(
          dbHandler.getPartnerJpaController(),
          dbHandler.getEntityClassesToControllersMap());
  rentalTableModel = new AsyncFullQueryingTableModel<>(
          dbHandler.getRentalJpaController(),
          dbHandler.getEntityClassesToControllersMap());
  vehicleTableModel = new AsyncOneByOneQueryingTableModel<>(
          dbHandler.getVehicleJpaController(),
          dbHandler.getEntityClassesToControllersMap());
  partnerTable = new JTable(partnerTableModel);
  rentalTable = new JTable(rentalTableModel);
  vehicleTable = new JTable(vehicleTableModel);
  tabbedPane = new JTabbedPane();
  tabbedPane.addTab("Partner", new JScrollPane(partnerTable));
  tabbedPane.addTab("Rental", new JScrollPane(rentalTable));
  tabbedPane.addTab("Vehicle", new JScrollPane(vehicleTable));
  getContentPane().add(tabbedPane, BorderLayout.CENTER);
}

@Override
public JMenuBar createJMenuBar() {
  newPartnerAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_P);
  newRentalAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_R);
  newVehicleAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_V);

  JMenuBar menuBar = new JMenuBar();

  JMenu nMenu = new JMenu("New");
  nMenu.setMnemonic(KeyEvent.VK_N);
  nMenu.add(new JMenuItem(newPartnerAction));
  nMenu.add(new JMenuItem(newRentalAction));
  nMenu.add(new JMenuItem(newVehicleAction));
  menuBar.add(nMenu);

  JMenu pMenu = new JMenu("Partners");
  pMenu.setMnemonic('p');
  pMenu.add(new JMenuItem(newPartnerAction));
  menuBar.add(pMenu);

  JMenu rMenu = new JMenu("Rentals");
  rMenu.setMnemonic('r');
  rMenu.add(new JMenuItem(newRentalAction));
  menuBar.add(rMenu);

  JMenu vMenu = new JMenu("Vehicles");
  vMenu.setMnemonic('v');
  vMenu.add(new JMenuItem(newVehicleAction));
  menuBar.add(vMenu);

  return menuBar;
}
private Action newPartnerAction = new AbstractAction("New partner") {
@Override
public void actionPerformed(ActionEvent e) {
  Partner partner = new Partner();
  String name = getString("What is the name of the new partner?");
  if (name == null) {
    return;
  }
  String address = getString("What is the address of " + name + "?");
  if (address == null) {
    return;
  }
  String phone = getString("What is the phone number of " + name + "?");
  if (name == null) {
    return;
  }
  partner.setName(name);
  partner.setPhone(phone);
  partner.setAddress(address);
  dbHandler.getPartnerJpaController().create(partner);
  partnerTableModel.refresh();
}
};
private Action newRentalAction = new AbstractAction("New rental") {
@Override
public void actionPerformed(ActionEvent e) {
  Partner partner = new Partner();
  String name = getString("What is the name of the new partner?");
  if (name == null) {
    return;
  }
  String address = getString("What is the address of " + name + "?");
  if (address == null) {
    return;
  }
  String phone = getString("What is the phone number of " + name + "?");
  if (name == null) {
    return;
  }
  partner.setName(name);
  partner.setPhone(phone);
  partner.setAddress(address);
  dbHandler.getPartnerJpaController().create(partner);
  partnerTableModel.refresh();
}
};
private Action newVehicleAction = new AbstractAction("New vehicle") {
@Override
public void actionPerformed(ActionEvent e) {
  Partner partner = new Partner();
  String name = getString("What is the name of the new partner?");
  if (name == null) {
    return;
  }
  String address = getString("What is the address of " + name + "?");
  if (address == null) {
    return;
  }
  String phone = getString("What is the phone number of " + name + "?");
  if (name == null) {
    return;
  }
  partner.setName(name);
  partner.setPhone(phone);
  partner.setAddress(address);
  dbHandler.getPartnerJpaController().create(partner);
  partnerTableModel.refresh();
}
};

private String getString(String message) {
  return JOptionPane.showInputDialog(rootPane, message, "Enter input",
                                     JOptionPane.QUESTION_MESSAGE);
}

private Partner getPartner(String message) {
  Object[] partners = dbHandler.getPartnerJpaController().findEntities().
          toArray();
  if (rootPaneCheckingEnabled) {
  }
  JOptionPane.showInputDialog(rootPane, message, "",
                              JOptionPane.QUESTION_MESSAGE);
  return null;
}

private Vehicle getVehicle(String message) {
  return null;
}

@Override
public void dispose() {
  dbHandler.close();
  setVisible(false);
  super.dispose();
}
}
