package edu.calpoly.csc480.Corral.Seer;

import java.awt.*;
import java.io.*;
import java.text.*;
import java.util.*;
import javax.swing.*;

import com.bcurry.www.text.*;
import com.bcurry.www.util.*;

import edu.calpoly.csc480.Corral.Main.*;

abstract public class BaseLogView
{
	static protected String headBanner = "\n";
	static protected String footBanner = "\n" +
	 "________________________________________" +
	 "________________________________________" + "\n"
	;
	
	public BaseLogView() {
		formater = new DateFormater();
		
		try {
			setFileName(
			 formater.formatFilename(new Date()) +
			 ".log");
		} catch (IOException err) {err.printStackTrace();}
	}
	
	final public BaseSeerView getOwner()		{return view;}
	final public String getFileName()			{return file.getAbsolutePath();}
	
	public void setOwner(BaseSeerView view)	{this.view = view;}
	public void setDocument(BaseSeer seer)		{this.seer = seer;}
	
	public void setFileName(String fileName) throws FileNotFoundException {
		file = new BasicFile(fileName);
		new FileOutputStream(file);
	}

	public void start() {
		final boolean autoFlush = true;
		
		try {
			fileStream = new FileOutputStream(file);
		} catch (IOException err) {err.printStackTrace();}

		textWriter = new PrintWriter(
		 new OutputStreamWriter(fileStream), autoFlush);
		
		textWriter.print(HelpMenu.getAboutText());
		textWriter.print(
		 headBanner + "foundation" + footBanner +
		 "inital time: " + formater.formatTimestamp(new Date()) + "\n" +
		 "free memory: " + Runtime.getRuntime().freeMemory() + "\n" +
		 "search type: " + seer.getAgentName() + "\n" +
		 "area layout:\n");

		try {
			seer.getArea().write(textWriter);
		} catch (IOException err) {err.printStackTrace();}
	}
	
	public void next() {
		if (fileStream == null && textWriter == null) {
			start();
		}

		textWriter.print(
		 headBanner + "cycle " + seer.getCycle() + footBanner
		);
		
		seer.getArea().getMeans().write(textWriter);
	}
	
	public void stop() {
		if (fileStream != null && textWriter != null) {
			textWriter.print(
			 headBanner + "completion" + footBanner +
			 "ending time: " + formater.formatTimestamp(new Date()) + "\n"
			);
			
			try {
				fileStream.close();
			} catch(IOException err) {err.printStackTrace();}
		}

		fileStream = null;
		textWriter = null;
	}

	protected BaseSeer seer;
	protected BaseSeerView view;
	
	protected DateFormater formater;
	protected BasicFile file;
	
	protected OutputStream fileStream;
	protected PrintWriter textWriter;
}