import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList; 
import java.io.*; 

public class CarnetDeAdrese extends JxFrame implements ActionListener { 

  /**
   * Panoul unde se afiseaza inregistrarile.
   */
  JList abPanel;  
  JLabel thisLabel;
  JScrollPane scrollPane; 
  
  JMenuItem searchMI;
  
  BazaDeDate database; 

  Introducere entryDialog;   
  
  public CarnetDeAdrese() { 
    super("Carnet de adrese");
    
    // Se foloseste managerul implicit BorderLayout, 
    Container contentPane = getContentPane();

    // Se adauga zona de afisare.
    abPanel = new JList();
    scrollPane = new JScrollPane(abPanel);
    contentPane.add(scrollPane, BorderLayout.CENTER);
      
    thisLabel = new JLabel("");
    contentPane.add(thisLabel, BorderLayout.SOUTH); 
	
    // Creaza Sistemul de meniuri.

    // Creaza bara de meniuri.
    JMenuBar menuBar = new JMenuBar();
    setJMenuBar(menuBar);

    // Construieste primul meniu.
    JMenu fileMenu = new JMenu("Fisier");
    menuBar.add(fileMenu);
    
    // Construieste grupul de elemente de meniu in meniul "Fisier".
    JMenuItem newMI = new JMenuItem("Nou"); 
    newMI.addActionListener(this); 
    fileMenu.add(newMI); 

    JMenuItem openMI = new JMenuItem("Deschide"); 
    openMI.addActionListener(this); 
    fileMenu.add(openMI); 

    JMenuItem saveMI = new JMenuItem("Salveaza");
    saveMI.addActionListener(this); 
    fileMenu.add(saveMI);

    JMenuItem closeMI = new JMenuItem("Inchide"); 
    closeMI.addActionListener(this); 
    fileMenu.add(closeMI); 
  
    // Adauga un separator.
    fileMenu.addSeparator(); 
    
    openMI.setMnemonic(KeyEvent.VK_D);
    
    JMenuItem exitMI = new JMenuItem("Termina");
    exitMI.addActionListener(this);
    fileMenu.add(exitMI); 
    
    // Construieste al doilea meniu.
    JMenu createMenu = new JMenu("Creaza");
    createMenu.setMnemonic(KeyEvent.VK_C);
    menuBar.add(createMenu);
    
    // Construieste grupul de elemente de meniu in meniul "Creaza".
    JMenuItem entryMI = new JMenuItem("Introduce");
    entryMI.addActionListener(this);
    createMenu.add(entryMI);

    // Construieste al treilea meniu.
    JMenu searchMenu = new JMenu("Cauta"); 
    menuBar.add(searchMenu); 

    searchMI = new JMenuItem("Cauta"); 
    searchMI.addActionListener(this); 
    searchMenu.add(searchMI); 
    searchMI.setEnabled(false); 
  }

  
  public void actionPerformed(ActionEvent e) {
    Object eventSource = e.getSource();
    if (eventSource instanceof JMenuItem) { 
      String label = (String) e.getActionCommand();
    	if (label.equals("Termina")) { 
    	  System.out.println("Aplicatia carnet de adrese se termina");
    	  dispose();
        System.exit(0);
      }
      else if (label.equals("Nou")) {
    	  thisLabel.setText("Creaza o noua baza de date"); 
        newDatabase(); 
      }
    	else if (label.equals("Deschide")) {
    	  thisLabel.setText("Deschide o baza de date");
        openDatabase(); }
      else if (label.equals("Salveaza")) {
        thisLabel.setText("Se salveaza baza de date");
        saveDatabase(); } 
      else if (label.equals("Inchide")) {
        thisLabel.setText("Se inchide baza de date");
        closeDatabase(); } 
      else if (label.equals("Introduce")) {
        thisLabel.setText("Creaza o noua intrare in baza de date"); 
        createEntry(); }
      else if (label.equals("Cauta")) {
        thisLabel.setText("Se cauta o inregistrare"); 
        searchDatabase(); } 
    }
  }
  
  private void openDatabase() {
    File file = null;
    JFileChooser fc = new JFileChooser();
    File startingPoint = new File("."); 
    fc.setCurrentDirectory(startingPoint); 
    int returnVal = fc.showOpenDialog(this);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
      file = fc.getSelectedFile(); 
      BazaDeDate db = new BazaDeDate(); 
      BazaDeDate res = db.loadFromFile(file); 
      System.out.println(res); 
      if (res != null) {
        database = res; 
        thisLabel.setText("Fisier incarcat"); 
        searchMI.setEnabled(true); 
      } 
    }
  }

  private void saveDatabase() {
    if (database == null) {
      thisLabel.setText("Nu s-a incarcat nici o baza de date"); 
      return; 
    } 
    File file = null;
    JFileChooser fc = new JFileChooser();
    fc.setCurrentDirectory(new File(".")); 
    int returnVal = fc.showSaveDialog(this);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
      file = fc.getSelectedFile();
      try {
        PrintWriter out =
          new PrintWriter(
            new BufferedWriter(
              new FileWriter(file)));
        database.saveData(out); 
        out.println("\n"); 
        out.close(); 
      }
      catch (IOException e) {} 
    }
  }

  private void newDatabase() {
    database = new BazaDeDate();
    searchMI.setEnabled(true);
  }

  private void closeDatabase() {
    database = null; 
    searchMI.setEnabled(false); 
  }

  private void createEntry() {
    if (database == null) {
      thisLabel.setText("Nu s-a incarcat nici o baza de date"); 
      return; 
    } 
    if (entryDialog == null) {
      entryDialog = new Introducere(this);
      entryDialog.pack();
      entryDialog.setLocationRelativeTo(this); 
    }
    entryDialog.setOldFields("","","");
    entryDialog.setTitle("Creaza o inregistrare"); 
    entryDialog.setVisible(true);  

    String name = entryDialog.getName(); 
    String addr = entryDialog.getAddress(); 
    String ph = entryDialog.getPhone(); 
    if (name != null && addr != null && ph != null) {
      database.addEntry(name,addr,ph);
      thisLabel.setText("Inregistrare creata"); 
    }
    repaint(); 
  }

  private void searchDatabase() {
    if (database == null) {
      thisLabel.setText("Nu s-a incarcat nici o baza de date"); 
      return; 
    } 
    if (entryDialog == null) {
      entryDialog = new Introducere(this);
      entryDialog.pack();
      entryDialog.setLocationRelativeTo(this); 
    }
    entryDialog.setOldFields("*","*","*");
    entryDialog.setTitle("Cauta o inregistrare"); 
    entryDialog.setVisible(true);  

    String name = entryDialog.getName(); 
    String addr = entryDialog.getAddress(); 
    String ph = entryDialog.getPhone(); 
    if (name != null && addr != null && ph != null) {
      ArrayList al = database.search(name,addr,ph); 
      abPanel.setListData(al.toArray()); 
      thisLabel.setText("Am gasit " + al.size() + " inregistrari"); 
    }
    repaint();  
  }    

  public static void main(String[] args) {
    CarnetDeAdrese window = new CarnetDeAdrese();  
    window.setSize(500, 400);
    window.setVisible(true);  
    BazaDeDate db = new BazaDeDate();
    window.database = db; 
    db.addEntry("Alex Ferguson", 
      "156 Salford Quay's Rd, Manchester", 
      "+44 (0)161 000 2343");
    db.addEntry("Ann Widdercombe", 
      "House of Commons, Westminster", "");
    db.addEntry("Alex Ferguson", 
      "MUFC, Old Trafford, Manchester", "");  
  }
}



