package framework;

import java.awt.event.ActionEvent;

import javax.swing.*;
import java.io.*;

/**
 * Called when items from the file menu are selected
 *
 * @author pearce
 *
 */
public class FileController extends Controller {

	/**
	 * memory for the last directory opened
	 */
	private File durrentDir;

	public FileController(View v) {
		super(v);
		File f = getTheModel().getFile();
		if (f != null) {
			durrentDir = f.getParentFile();
		}
	}

	/**
	 * Asks user if model should be saved
	 * @return true if yes
	 */
	private boolean saveChanges() {
		if (!getTheModel().isChanged()) return false;
		int choice = JOptionPane.showConfirmDialog(theView, "save changes?");
		return choice == 0;
	}

	/**
	 * Prompts user for file to be saved or open
	 * @return the selected file
	 */
	private File getFile() {
		 JFileChooser chooser = new JFileChooser();
		 if (durrentDir != null) {
			 chooser.setCurrentDirectory(durrentDir);
		 }
		 chooser.showOpenDialog(theView);
		 File result = chooser.getSelectedFile();
		 durrentDir = result.getParentFile();
		 return result;
	}

	/**
	 * Replaces existing model with model read from selected file.
	 */
	private void open() {
		File f = getFile();
		try {
			ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
			Model savedModel = (Model)ois.readObject();
			theView.setTheModel(savedModel);
		} catch(Exception e) {
			GUIUtils.error(e.getMessage());
		}
	}

	/**
	 * Saves model to selected file.
	 * @param saveAs prompt user for new file if true
	 */
	private void save(boolean saveAs) {
		Model theModel = getTheModel();
		if (!saveAs && !theModel.isChanged()) return; // nothing to do
		File f = theModel.getFile();
		if (f == null || saveAs) {
			f = getFile();
			theModel.setFile(f);
		}
		try {
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
			oos.writeObject(theModel);
			theModel.setChanged(false);
		} catch(Exception e) {
			GUIUtils.error(e.getMessage());
		}
	}

	public void actionPerformed(ActionEvent e) {
		String cmmd = e.getActionCommand();
		if (cmmd.equals("Exit")) {
			if (saveChanges()) save(false);
			System.exit(0);
		} else if (cmmd.equals("Save")) {
			save(false);

		} else if (cmmd.equals("SaveAs")) {
			save(true);

		} else if (cmmd.equals("Open")) {
			if (saveChanges()) save(false);
			open();

		} else {
			GUIUtils.error("unrecognized command: " + cmmd);
		}
	}

}