package;

// Kha
import kha.input.KeyCode;

// Zui
import leenkx.ui.Canvas;

// Editor
import lnx2d.Editor;

class Main {

	public static var prefs:TPrefs = null;
	public static var cwd = ""; // Canvas path
	public static var inst:Editor;

	public static function main() {

		var w = 1600;
		var h = 900;
		if (kha.Display.primary != null) { // TODO: no Display.primary returned on Linux
			if (w > kha.Display.primary.width) w = kha.Display.primary.width;
			if (h > kha.Display.primary.height - 30) h = kha.Display.primary.height - 30;
		}
		kha.System.start({ title : "Leenkx2D", width : w, height : h, framebuffer : {samplesPerPixel : 2}}, initialized);
	}

	static function initialized(window:kha.Window) {

		prefs = {
			path: "",
			scaleFactor: 1.0,
			keyMap: {
				selectMouseButton: "Left",
				grabKey: KeyCode.G,
				rotateKey: KeyCode.R,
				sizeKey: KeyCode.S,
				slowMovement: KeyCode.Shift,
				gridInvert: KeyCode.Control,
				gridInvertRelative: KeyCode.Alt,
			}
		};

		#if kha_krom

		var c = Krom.getArgCount();
		// ./krom . . canvas_path scale_factor
		if (c > 4) prefs.path = Krom.getArg(3);
		if (c > 5) prefs.scaleFactor = Std.parseFloat(Krom.getArg(4));

		var ar = prefs.path.split("/");
		ar.pop();
		cwd = ar.join("/");

		if(cwd != ""){
			var path = kha.System.systemId == "Windows" ? StringTools.replace(prefs.path, "/", "\\") : prefs.path;
			kha.Assets.loadBlobFromPath(path, function(cblob:kha.Blob) {
				inst = new Editor(Canvas.parseCanvasFromBlob(cblob));
			});
		}
		else {
			prefs.path = Krom.getFilesLocation();
		#end
			var raw:TCanvas = { name: "untitled", x: 0, y: 0, width: 1280, height: 720, theme: "Default Light", visible: true, elements: [], assets: [] };
			inst = new Editor(raw);
		#if kha_krom
		}
		#end
	}

	static function loadDefaultKeyMap() {
		Main.prefs.keyMap.grabKey = KeyCode.G;
		Main.prefs.keyMap.rotateKey = KeyCode.R;
		Main.prefs.keyMap.sizeKey = KeyCode.S;
		Main.prefs.keyMap.slowMovement = KeyCode.Shift;
		Main.prefs.keyMap.gridInvert = KeyCode.Control;
		Main.prefs.keyMap.gridInvertRelative = KeyCode.Alt;
	}
}

typedef TPrefs = {
	var path:String;
	var scaleFactor:Float;
	var keyMap:TKeyMap;
	@:optional var window_vsync:Bool;
}

typedef TKeyMap = {
	var selectMouseButton:String;
	var grabKey:Int;
	var rotateKey:Int;
	var sizeKey:Int;
	var slowMovement:Int; // Key which slows down manipulation
	var gridInvert:Int; // Toggles the grid setting during element manipulation
	var gridInvertRelative:Int; // Make the grid relative to the selected element
}