package com.haxademic.app.exampleapp;

import java.io.File;
import java.io.IOException;

import com.haxademic.core.app.PAppletHax;
import com.haxademic.core.data.constants.PTextAlign;
import com.haxademic.core.debug.StringBufferLog;
import com.haxademic.core.draw.text.FontCacher;
import com.haxademic.core.file.FileUtil;
import com.haxademic.core.media.DemoAssets;

import processing.core.PFont;

public class AppGenerator
extends PAppletHax {
	public static void main(String args[]) { arguments = args; PAppletHax.main(Thread.currentThread().getStackTrace()[1].getClassName()); }
	
	protected String newProjectName = "new-hax-project";
	protected StringBufferLog log = new StringBufferLog(20, 16);
	
	protected File haxPath;
	protected String parentDir;
	protected String newProjectDir;
	
	protected void firstFrame() {
		// get haxademic & parent dirs
		haxPath = new File(FileUtil.curProjectPath());
		parentDir = haxPath.getParent();
	}
	
	protected void drawApp() {
		p.background(0);
		
		// info
		String fontFile = DemoAssets.fontOpenSansPath;
		PFont font = FontCacher.getFont(fontFile, 20);
		FontCacher.setFontOnContext(p.g, font, p.color(255), 2f, PTextAlign.LEFT, PTextAlign.TOP);
		p.text("Press spacebar to generate project:" + FileUtil.NEWLINE + 
			   newProjectName + FileUtil.NEWLINE +
			   "Please be careful." + FileUtil.NEWLINE
			   , 20, 20);

		// print log
		log.printToScreen(p.g, 20, 200);
	}
	
	protected void generateProject() {
		// create project dir
		newProjectDir = parentDir + FileUtil.SEPARATOR + newProjectName;
		boolean projectDirCreated = FileUtil.createDir(newProjectDir);
		log.update("==============================");
		log.update("New Project dir created: "+projectDirCreated);
		log.update("-> " + newProjectName);
		FileUtil.createDir(newProjectDir + FileUtil.safePath("/output"));
		
		// copy example app
		String exampleAppPackage = "/src/com/haxademic/app/exampleapp";
		String exampleAppClass = "/ExampleApp.java";
		String destSrcPath = newProjectDir + FileUtil.safePath(exampleAppPackage);
		String srcAppPath = haxPath + FileUtil.safePath(exampleAppPackage + exampleAppClass);
		String destAppPath = destSrcPath + FileUtil.safePath(exampleAppClass);
		boolean srcDirCreated = FileUtil.createDir(destSrcPath);
		log.update("==============================");
		log.update("src dir created:" + srcDirCreated);
		log.update("-> " + destSrcPath);
		try {
			FileUtil.copyFile(srcAppPath, destAppPath);
			log.update("==============================");
			log.update("app class created:");
			log.update("-> " + destAppPath);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		// copy haxademic assets
		copyDir("/data/haxademic");
		copyDir("/www/ui");
		copyDir("/scripts");

		// copy select libs
		copyDir("/lib/beads");
		copyDir("/lib/dmxP512");
		copyDir("/lib/Ess");
		copyDir("/lib/haxademic");
		copyDir("/lib/java_websocket");
		copyDir("/lib/jetty");
		copyDir("/lib/minim");
		copyDir("/lib/processing-3");
		copyDir("/lib/themidibus");
		copyDir("/lib/UMovieMaker");
		
		// copy project files
		FileUtil.writeTextToFile(	// .gitignore
				FileUtil.safePath(newProjectDir + "/.gitignore"), 
				FileUtil.textLinesJoined(new String[] {
						"_assets", "bin/", "output/", "*Thumbs.db", ".DS_Store"
				})
		);
		try {
			String classPathMinimal = FileUtil.safePath(haxPath + "/.classpath-example");
			String classPathDest = FileUtil.safePath(newProjectDir + "/.classpath");
			FileUtil.copyFile(classPathMinimal, classPathDest);
			log.update("==============================");
			log.update("Minimal .classpath copied:");
			log.update("-> "+classPathDest);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		// copy & update .project file
		copyFile(".project");
		try {
			FileUtil.replaceStringInFile(newProjectDir + "/.project", "haxademic", newProjectName);
		} catch (IOException e) {
			e.printStackTrace();
		}

		// we did it!
		log.update("==============================");
		log.update("DONE!");
		log.update("==============================");
	}
	
	protected void copyFile(String file) {
		String origHaxPath = FileUtil.safePath(haxPath + "/" + file);
		String destPath = FileUtil.safePath(newProjectDir + "/" + file);
		try {
			FileUtil.copyFile(origHaxPath, destPath);
			log.update("==============================");
			log.update("Project file copied:");
			log.update("-> "+origHaxPath);
			log.update("-> "+destPath);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	protected void copyDir(String dir) {
		try {
			String origHaxPath = haxPath + FileUtil.safePath(dir);
			String destPath = newProjectDir + FileUtil.safePath(dir);
			FileUtil.createDir(destPath);
			FileUtil.copyFolder(origHaxPath, destPath);
			log.update("==============================");
			log.update("Haxademic "+ dir +" copied to project:");
			log.update("-> "+origHaxPath);
			log.update("-> "+destPath);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	public void keyPressed() {
		super.keyPressed();
		if(p.key == ' ') {
			new Thread(new Runnable() { public void run() {
				generateProject();
			}}).start();
		}
	}
	
}