Import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;

import javax.swing.JFileChooser;

public class FileManager {
    private static JFileChooser chooser = null;

    public static FileManager promptUser(String title, String button) {
        if(chooser == null) chooser = new JFileChooser();
        chooser.setDialogTitle(title);
        int action = chooser.showDialog(null, button);
        if(action != JFileChooser.APPROVE_OPTION) {
            return null;
        } else {
            return new FileManager(chooser.getSelectedFile());
        }
    }
        
    private File file;
    private String filename;
    private BufferedReader input;
    private PrintWriter output;

    // Pre: name != null
    // Post: getFilename().equals(name); !isOpen()
    public FileManager(String name) {
        file = new File(name);
        filename = name;
        input = null;
        output = null;
    }

    public FileManager(File myFile) {
        file = myFile;
        filename = myFile.getName();
        input = null;
        output = null;
    }

    // Inspectors
    public String getFilename() { return filename; }
    public boolean isOpenForRead() { return input != null; }
    public boolean isOpenForWrite() { return output != null; }
    public boolean isOpen() { return isOpenForRead() || isOpenForWrite(); }

    public String toString() { return getFilename(); }

    // Mutators

    // Pre: !isOpen()
    // Post: isOpenForRead() if getFilename() can be opened for input;
    //       otherwise, !isOpenForRead()
    public void openForRead() {
        if (isOpen()) {
            throw new IllegalStateException(filename + " is already open");
        }

        try {
            input = new BufferedReader(new FileReader(file));
        } catch (FileNotFoundException e) {}
    }

    // Pre: !isOpen()
    // Post: isOpenForWrite() if getFilename() can be opened for output;
    //       otherwise, !isOpenForWrite()
    public void openForWrite() {
        try {
            output = new PrintWriter(new FileWriter(file));
        } catch (IOException e) {}
    }

    // Pre: None
    // Post: !isOpen()
    public void close() {
        try {
            if (input != null) {
                input.close();
            }
            if (output != null) {
                output.close();
            }
        } catch (IOException e) {
            // Exceptions are ignored
            // Just close everything up
        } finally {
            input = null; 
            output = null;
        }
    }

    // Pre: isOpenForRead()
    // Post: Returns next line of input from getFilename() if available
    //       Returns null if the end of input has been reached
    public String readLine() {
        try {
            return input.readLine();
        } catch (IOException e) {
            return null;
        }
    }

    // Pre: isOpenForWrite()
    // Post: Appends s to getFilename()
    public void print(String s) {
        output.print(s);
    }

    // Pre: isOpenForWrite()
    // Post: Appends s and newline to getFilename()
    public void println(String s) {
        output.println(s);
    }

    // Pre: isOpenForWrite()
    // Post: Appends newline to getFilename()
    public void println() {
        output.println();
    }
}
