package ch.wlkl.shell;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileRW extends Top implements Read<String>, Write<String> {
	
	private BufferedWriter writer = null;
	private BufferedReader reader = null;
	private String filename = null;
	
	public FileRW () {
	}

	public FileRW (String fn) {
		reset(fn);
	}

	public void reset(String fn) {
		close();
		filename = fn;
		if (fn.charAt(0) == Cat.eExtFD)
			sFail("reset(" + fn + ") external FD not supported");
	}

	public void reset(Object... o) {
		if (o.length != 1)
			fail("reset with " + o.length + " args instead of 1");
		else if (! (o[0] instanceof String)) 
			fail("reset(" + o[0] + ") arg not String");
		reset((String) o[0]);	
	}

	public void open(String opt) {
		boolean app = false;
		if (opt.indexOf('r') >= 0) {
			reader = fileReader(filename);
		} else if (opt.indexOf('w') >= 0 || (app = opt.indexOf('a') >= 0)) {	
			writer = fileWriter(filename, app);
		} else {
			fail("bad opt for open(" + opt + ")");
		}
	}

	public void close() {
		try {
			if (writer != null) {
				writer.close();
				writer = null;
			}
			if (reader != null) {
				reader.close();
				reader = null;
			}
		} catch (IOException e) {
			fail("close of " + filename + " caught " + e);
		}
	}
	
	public String read() {
		try {
			return reader.readLine();
		} catch (IOException e) {
			fail("write read " + filename + " caught " + e);
			return null;
		}
	}
	
	public void write(String data) {
		try {
			writer.write(data);
			writer.newLine();
		} catch (Exception ex) {
			fail("write on " + filename + " caught " + ex);
		}
	}
	
	static public BufferedReader fileReader(String fileName) {
		try {
			return new BufferedReader(new FileReader(fileName));
		} catch (FileNotFoundException e) {
			sFail("fileReader open " + fileName + " caught " + e);
			return null;
		}
	}
	
	static public BufferedWriter fileWriter(String fileName, boolean app) {
		try {
			return new BufferedWriter(new FileWriter(fileName, app));
		} catch (Exception ex) {
			try {
				new File(fileName).getParentFile().mkdirs();
				return new BufferedWriter(new FileWriter(fileName, app));
			} catch (Exception e2) {
				Top.sFail("fileWriter open(" + fileName + ") caught " + ex + " and after mkdirs " + e2);
				return null;
			}
		}
	}	
}

