import {
	mainloop,
	frame,
	clearScreen,
} from "./window.ts";
import { runCode } from "./runcode.ts";
import { getCodeSheet } from "./sheet.ts";
import { refreshKeyboard, keyPressed, K } from "./keyboard.ts";
import { repl, resetRepl } from "./repl.ts";
import { addToContext } from "./runcode.ts";
import { editmode } from "./editmode.ts";
import { refreshMouse } from "./mouse.ts";
import { camera } from "./builtins.ts";

// deno-lint-ignore no-explicit-any
let game: any = null;

let mode: "play" | "edit" | "repl" = "repl";

addToContext("play", () => {
	mode = "play";
	game = runCode(getCodeSheet(0));
	game.init();
});

clearScreen();
  
await mainloop(async (_t) => {
	// TODO: use t
	if (keyPressed(K.ESCAPE)) {
		const modeTo = ({
			play: "repl",
			edit: "repl",
			repl: "edit",
		} as const)[mode];
		if (mode === "play") {
			resetRepl();
		}
		if (mode === "edit") {
			clearScreen();
		}
		mode = modeTo;
	} else {
		if (mode === "play") {
			if (game) {
				game.update();
				game.draw();
			}
			frame();
		} else if (mode === "repl") {
			repl.update();
			camera(0, 0);
			repl.draw();
			frame();
		} else if (mode === "edit") {
			await editmode.update();
			camera(0, 0);
			editmode.draw();
			frame();
		}
	}
	refreshKeyboard();
	refreshMouse();
}, false);