package simplejpa;

import hu.elte.inf.pszt.prt.javalib.utils.ElteJOptionPane;
import java.util.Map;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import simplejpa.exceptions.NonexistentEntityException;

/**
 * @author Daniel "3ICE" Berezvai
 */
public class SimpleJPA {

public static void main(String[] args) {
  Map<String, String> map = new TreeMap<>();
  String passwd = ElteJOptionPane.showPasswordDialog("Password?");
  map.put("javax.persistence.jdbc.password", passwd);
  EntityManagerFactory emf =
                       Persistence.createEntityManagerFactory("PlanetPU", map);
  EntityManager em = emf.createEntityManager();

  PlanetJpaController ctr = new PlanetJpaController(emf);
  for (Planet planet : ctr.findPlanetEntities()) {
    System.out.println(planet.getName());
  }

  TableModel tm = new PlanetsTableModel(ctr);
  JTable t = new JTable(tm);
  JFrame frame = new JFrame();
  frame.getContentPane().add(new JScrollPane(t));
  frame.pack();
  frame.setVisible(true);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
  em.close();
}

private static class PlanetsTableModel extends AbstractTableModel {

PlanetJpaController ctr;

private PlanetsTableModel(PlanetJpaController ctr) {
  this.ctr = ctr;
}

@Override
public int getRowCount() {
  return ctr.getPlanetCount();
}

@Override
public int getColumnCount() {
  return 6;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
  Planet p = ctr.findPlanetEntities().get(rowIndex);
  switch (columnIndex) {
  case 0:
    return p.getName();
  case 1:
    return p.getDiameter();
  //stb...
  default:
    return null;
  }
}

@Override
public Class<?> getColumnClass(int columnIndex) {
  return getRowCount() > 0 ? getValueAt(0, columnIndex).getClass() : null;
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
  return columnIndex < 5;
}

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
  Planet p = ctr.findPlanetEntities().get(rowIndex);
  switch (columnIndex) {
  case 0:
    p.setName((String) aValue);
    break;
  case 1:
    p.setDiameter((int) aValue);
    break;
  //stb...
  }
  try {
    ctr.edit(p);
  } catch (NonexistentEntityException ex) {
    System.err.println(ex.getMessage());
  } catch (Exception ex) {
    System.err.println(ex.getMessage());
  }
}
}
}
