package gui;

import db.DatabaseHandler;
import db.Partner;
import db.Rental;
import db.Vehicle;
import hu.elte.inf.pszt.prt.javalib.db.jpa.exceptions.*;
import hu.elte.inf.pszt.prt.javalib.gui.EntityEditorDialog;
import hu.elte.inf.pszt.prt.javalib.gui.EntityEditorDialogFactory;
import hu.elte.inf.pszt.prt.javalib.gui.tablemodel.AsyncFullQueryingTableModel;
import hu.elte.inf.pszt.prt.javalib.gui.tablemodel.AsyncOneByOneQueryingTableModel;
import hu.elte.inf.pszt.prt.javalib.gui.tablemodel.JpaControlledTableModel;
import hu.elte.inf.pszt.prt.javalib.swingapp.ElteJFrame;
import hu.elte.inf.pszt.prt.javalib.utils.ElteJOptionPane;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.util.Calendar;
import java.util.Date;
import java.util.logging.*;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;

/**
 *
 * @author trust56 http://lengyel.web.elte.hu/store/prt2/SwingAppBase.zip
 * @contributor Daniel "3ICE" Berezvai
 */
public class MainFrame extends ElteJFrame {
  protected final String FRAME_TITLE = "Vehicle Repository";
  private DatabaseHandler dbHandler;
  private JTabbedPane tabbedPane;
  private JTable parterTable, vehicleTable, rentalTable;
  private JpaControlledTableModel<Partner> partnerTableModel;
  private JpaControlledTableModel<Vehicle> vehicleTableModel;
  private JpaControlledTableModel<Rental> rentalTableModel;

  @Override
  public void onCreate() {
    setDefaults(FRAME_TITLE);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    dbHandler = new DatabaseHandler();
    dbHandler.open();
    tabbedPane = new JTabbedPane();

    partnerTableModel = new AsyncOneByOneQueryingTableModel<>(
            dbHandler.getPartnerJpaController(),
            dbHandler.getEntityClassesToControllersMap());
    parterTable = new JTable(partnerTableModel);
    vehicleTableModel = new AsyncFullQueryingTableModel<>(
            dbHandler.getVehicleJpaController(),
            dbHandler.getEntityClassesToControllersMap());
    vehicleTable = new JTable(vehicleTableModel);
    rentalTableModel = new AsyncOneByOneQueryingTableModel<>(
            dbHandler.getRentalJpaController(),
            dbHandler.getEntityClassesToControllersMap());
    rentalTable = new JTable(rentalTableModel);

    tabbedPane.addTab("Partners", new JScrollPane(parterTable));
    tabbedPane.addTab("Vehicles", new JScrollPane(vehicleTable));
    tabbedPane.addTab("Rentals", new JScrollPane(rentalTable));
    getContentPane().add(tabbedPane, BorderLayout.CENTER);
  }

  @Override
  public JMenuBar createJMenuBar() {
    JMenuBar menuBar = new JMenuBar();
    JMenu menu = new JMenu("Data");
    menuBar.add(menu);
    menu.add(new JMenuItem(newPartnerAction));
    menu.add(new JMenuItem(newVehicleAction));
    menu.add(new JMenuItem(newRentalAction));
    menu.add(new JMenuItem(closeRentalAction));
    return menuBar;
  }
  private Action newPartnerAction = new AbstractAction("New partner") {
    @Override
    public void actionPerformed(ActionEvent e) {
      Partner partner = new Partner();
      EntityEditorDialog<Partner> editorDialog = EntityEditorDialogFactory.
              createEditorDialog(partner, dbHandler.getPartnerJpaController());
      editorDialog.setVisible(true);
      partnerTableModel.refresh();
    }
  };
  private Action newVehicleAction = new AbstractAction("New vehicle") {
    @Override
    public void actionPerformed(ActionEvent e) {
      Vehicle vehicle = new Vehicle();
      EntityEditorDialog<Vehicle> editorDialog = EntityEditorDialogFactory.
              createEditorDialog(vehicle, dbHandler.getVehicleJpaController());
      editorDialog.setVisible(true);
      vehicleTableModel.refresh();
    }
  };
  private Action newRentalAction = new AbstractAction("New rental") {
    @Override
    public void actionPerformed(ActionEvent e) {
      Rental rental = new Rental();
      EntityEditorDialog<Rental> editorDialog = EntityEditorDialogFactory.
              createEditorDialog(rental, dbHandler.getRentalJpaController(),
                                 dbHandler.getEntityClassesToControllersMap());
      editorDialog.setVisible(true);
      //ToDo: "Szabad-e a jármű" ellenőrzése
      rental.setBringBackRental(null);
      try {
        dbHandler.getRentalJpaController().edit(rental);
      } catch (Exception ex) {
        ElteJOptionPane.showError(rootPane, "Cannot modify the rental."
                                            + ex.getMessage());
      }
      rentalTableModel.refresh();
    }
  };
  private Action closeRentalAction = new AbstractAction("Close rental") {
    @Override
    public void actionPerformed(ActionEvent e) {
      int selectedRow = rentalTable.getSelectedRow();
      if (selectedRow == -1) {
        ElteJOptionPane.showError(rootPane,
                                  "Please select a rental from the table of rentals");
      } else {
        Rental rental = dbHandler.getRentalJpaController().findEntities().get(
                selectedRow);
        if (rental.getBringBackRental() != null) {
          ElteJOptionPane.showError(rootPane,
                                    "The selected rental is already closed");
        } else {
          Date now = Calendar.getInstance().getTime();
          rental.setBringBackRental(new java.sql.Date(now.getTime()));
          int priceOfRental = rental.getPriceOfRental();
          ElteJOptionPane.showInfo(rootPane, "The total cost of the rental is: "
                                             + priceOfRental);
          try {
            dbHandler.getRentalJpaController().edit(rental);
          } catch (Exception ex) {
            ElteJOptionPane.showError("Cannot close rental: " + ex.getMessage());
          }
          rentalTableModel.refresh();
        }
      }
    }
  };

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

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

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