/*
 * Created on Mar 17, 2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.dragonsoft.tryapp.support;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import com.dragonsoft.tryapp.common.SubmissionObj;
import com.dragonsoft.tryapp.common.exceptions.ExceptionHandler;
import com.dragonsoft.tryapp.common.exceptions.TryException;
import com.dragonsoft.tryapp.common.exceptions.TryIOException;
/**
 * @author Greg
 *
 * Represents the file structure for the <Insert Name Here> Application.
 * This object allows for a platform independant way to use and connect to the try filesystem.
 * 
 * This object relies heavily on the Property, tryapp.rootdir
 */
public class TryFileSystem implements java.io.Serializable{
	private static int STARTYEAR = 0;
	private static int ENDYEAR=STARTYEAR+5;
	private static int STARTCOURSE=ENDYEAR;
	private static int ENDCOURSE=STARTCOURSE+3;
	private static int STARTSECTION = ENDCOURSE;
	
	private static File root;
	private static File assigns;
	private static File subs;
	
	public static final String ASSIGNMENT = "assignments";
	public static final String SUBMISSION = "submissions";
	public static final String TRYAPP_ROOT = "tryapp.root";
	public static final String SUBMIT_FILES="submitted_files";
	
	public TryFileSystem(){
	}
	
	public static void init() throws IOException{
		root = new File(System.getProperty(TRYAPP_ROOT));
		
	///	System.out.println("CONON "+root.getCanonicalPath());
		
		assigns = new File(root.getAbsolutePath()+File.separator+ASSIGNMENT);
		subs = new File(root.getAbsolutePath()+File.separator+SUBMISSION);
		if(!subs.exists()){
			if(subs.mkdir()){
				if(!assigns.exists()){
					if(!assigns.mkdir()){
						throw new IOException("UnWritable Assignment Dir:"+assigns.getCanonicalPath());
					}
				}
				
			}else{
				throw new IOException("UnWritable Submission Dir:"+subs.getCanonicalPath());
			}
		}
	
	}
	
	public static String getAssignmentDirectory() throws TryException{
		if(assigns == null)
			try {
				init();
			} catch (IOException e) {
				throw new TryException("Could not initialize FileSystem.",e);
			}
		return assigns.getAbsolutePath();
	}
	
	public static String getSubmissionDirectory() throws TryException{
		if(subs == null)
			try {
				init();
			} catch (IOException e) {
				throw new TryException("Could not intialize FileSystem.",e);
			}
		return subs.getAbsolutePath();
	}
	
	public static String getPathToStudentSubmission(SubmissionObj submission) throws TryException{
		StringBuffer rtVal = new StringBuffer(getSubmissionDirectory());
		rtVal.append(File.separator).append(submission.getCourseID().substring(STARTYEAR, ENDYEAR));
		rtVal.append(File.separator).append(submission.getCourseID().substring(STARTCOURSE, ENDCOURSE));
		rtVal.append(File.separator).append(submission.getCourseID().substring(STARTSECTION));
		rtVal.append(File.separator).append(submission.getAssignmentID());
		rtVal.append(File.separator).append(submission.getActivityID());
		rtVal.append(File.separator).append(submission.getStudentUsername());
		rtVal.append(File.separator).append(SUBMIT_FILES);
		rtVal.append(File.separator);
		return rtVal.toString();
	}
	
	public static void copy(String orignal, String dest){
		FileReader reader = null;
		FileWriter writer = null;
		if(!orignal.equals(dest)){
		int swap = 0;
			try {
				reader = new FileReader(orignal);
				writer = new FileWriter(dest);
				while ((swap = reader.read()) != -1) {
					writer.write(swap);
				}
				writer.flush();
				reader.close();
				writer.close();

			} catch (IOException e) {
				ExceptionHandler.logException(e, new TryFileSystem());
			}
		}
	}
	
	public static void rmdir(File dir) throws TryIOException{
		if(dir.isDirectory()){
			String[] files = dir.list();
			for (int i = 0; i < files.length; i++) { 
					rmdir(new File(dir,files[i])); // has to be absolute path.
				
			}
		}
		if(!dir.delete()){
			throw new TryIOException("COULD NOT DELETE FILE" + dir);
		}
	}
	public static void main(String args[])throws Exception{
		System.setProperty(TryFileSystem.TRYAPP_ROOT,"C:\\");
		TryFileSystem sys = new TryFileSystem();
		System.out.println("Assignment Dir = " +TryFileSystem.getAssignmentDirectory());
		System.out.println("Submission Dir = " + TryFileSystem.getSubmissionDirectory());
	}

}
