import Canvas from "../../hampsterengine/src/canvas.js";
import Engine from "../../hampsterengine/src/engine.js";
import Keyboard from "../../hampsterengine/src/keyboard";
import {FontRenderer, Stars} from "./objects";

import SoundBox from "./sb-player-small";
// import {mus_DEMOSONG} from "./songs/DEMOSONGDONOTCOMMIT";

// dependencies used for debugging. comment out code that uses this and they won't be included
import Stats from "stats.js";

// Images
import font from "../img/font.webp";

// Rooms
import {rm_mainMenu} from "./rooms/mainMenu";
import {rm_game} from "./rooms/game";
// import {rm_DEBUG_button} from "./rooms/debug_button";
// import {rm_DEBUG_mouse} from "./rooms/debug_mouse";
// import {rm_DEBUG_music} from "./rooms/debug_music";
import {rm_DEBUG_INCURSION} from "./rooms/debug_incursion";
import {rm_DEBUG_text} from "./rooms/debug_text";
import {rm_DEBUG_stars} from "./rooms/debug_stars";
import {rm_DEBUG_sprites} from "./rooms/debug_sprites";

// Music
// There is none

// Parse query parameters
const query = new URLSearchParams(window.location.search);
window.query = query;

// Init the engine and canvas
const canvas = new Canvas(c);
const engine = new Engine(canvas);
const assets = engine.assetStore;
const keyboard = new Keyboard();
assets.addImage('font', font);

const fontRenderer = new FontRenderer(assets.get`font`);
window.fR = fontRenderer
// const mouse = new Mouse(engine);
// window.mouse = mouse;

engine.debug = query.get`debug`;
window.debug = engine.debug;

canvas.width = 256;
canvas.height = 240;

canvas.setScale();
canvas.ctx.imageSmoothingEnabled = false;

const floor = Math.floor;
const u = _=> {
    const w = innerWidth;
    const h = innerHeight;
    const wS = floor(w/256);
    const hS = floor(h/240);
    const s=Math.min(wS,hS);
    canvas.width = 256*s;
    canvas.height= 240*s;
    canvas.pixelRatio = s;
    canvas.setScale(canvas.scale);
    canvas.ctx.imageSmoothingEnabled = false;
}
u();addEventListener('resize', u, !0);

engine.running = false; // Game uses this as a pause state actually

// // Prerender the stars
// const tempCanvasStars = document.createElement("canvas");
// tempCanvasStars.width = 2560;
// tempCanvasStars.height = 2400;
// const stars = new Stars(tempCanvasStars);
// window.starsTest = stars;
// stars.draw(0, 0, 2560, 2400);
// const createStarsObjectURL = blob => {
//     assets.addImage('stars', URL.createObjectURL(blob));
// }
// tempCanvasStars.toBlob(createStarsObjectURL);

assets.addMiniSprite('grass', 'IIIIIIQIQQQJZQZZRZRRZRZRSSRSRZZR');
assets.renderMiniSprite('grass', ['#2a6', '#964', '#853']);

engine.registerRoom(rm_mainMenu, 'mainMenu');
engine.registerRoom(rm_game, 'game');

// engine.registerRoom(rm_DEBUG_button, 'debug_button');
// engine.registerRoom(rm_DEBUG_mouse, 'debug_mouse');
// engine.registerRoom(rm_DEBUG_music, 'debug_music');
engine.registerRoom(rm_DEBUG_INCURSION, 'debug_incursion');
engine.registerRoom(rm_DEBUG_text, 'debug_text');
engine.registerRoom(rm_DEBUG_stars, 'debug_stars');
engine.registerRoom(rm_DEBUG_sprites, 'debug_sprites');

// Init stats.js
const stats = new Stats();
stats.showPanel(0);
document.body.appendChild( stats.dom );

let physicsFrame=0;
window.physicsFrame = physicsFrame;

let readyTime = 0;

function main() {
    // Draw things. no user interaction or physics here.

    try {
        stats.begin();
        engine.frames++;
        canvas.fill(engine.room.bgColor ?? 'black');

        engine.draw();
        engine.drawGui();

        // engine.drawCursor();

        stats.end();

        if (debug) {
            canvas.drawText(`physics ticks: ${engine.physicsFrames} (~${(engine.physicsFrames/60).toFixed(1)}sec)`, 0, 0,{textBaseline:'top'})
            canvas.drawText(`frames: ${engine.frames}`, 0, 8,{textBaseline:'top'})
            canvas.drawText(`run time: ${((performance.now()-readyTime)/1000).toFixed(1)}sec`, 0, 16, {textBaseline:'top'})
            canvas.drawText(`keys: ${JSON.stringify(keyboard.keys)}`, 0, 24, {textBaseline:'top'})
        }

        // Ask to run at the next frame
        requestAnimationFrame(main);
    } catch (e) {
        engine.running = false;

        canvas.pixelRatio = 2;
        canvas.ctx.setTransform(canvas.pixelRatio, 0, 0, canvas.pixelRatio, 0, 0);
        canvas.fill('#a05555d0');

        const logo = assets.get`splash`
        canvas.drawImage(logo, 10, 10, logo.width, logo.height)

        canvas.setFillColor`black`;
        canvas.drawText(e, 5, canvas.height-5, {
            maxWidth: canvas.width-10,
            textBaseline: 'bottom'
        });

        throw e;
    }
}

function physicsTick() {
    // Runs 60 times a second regardless of frame rate.
    engine.physicsFrames++;
    engine.lastPhysicsFrame = performance.now();

    engine.room.step();

    keyboard.keysThisFrame = [];
    keyboard.keysUpThisFrame = [];
}

console.debug(engine.rooms);

if (query.get`room`) {
    console.log('Requesting room', query.get`room`);
    engine.loadDelay = 0;
    engine.room = engine.getRoomIndex(query.get`room`);
} else {
    engine.room = engine.getRoomIndex`mainMenu`;
}

// Ensure assets are loaded.
function load() {
    if (engine.loading) {
        engine.loadLoop();
        setTimeout(load, 1000/60);
    } else {
        readyTime = performance.now();
        engine.lastPhysicsFrame = performance.now();
        main();
        setInterval(physicsTick, (query.get`slowdown` ? 500 : 1000/60)); // Update physics 60 times a second
    }
}

load();