'use strict';

import Setting from "./Setting.js";
import GraphicSet from "./GraphicSet.js";
import ImageLoader from "./ImageLoader.js";
import Level from "./Level.js";
import UrlParam from "./UrlParam.js";
import {LoadLevelDialog} from "./ui/LoadLevelDialog.js";
import {EventBus} from "./events/EventBus.js";
import {Game} from "./Game.js";


function mainLoop(timestamp)
{
    if (game.isPaused) {
        return;
    }

    if (game.lastRendered === undefined && game.lastTimestamp === undefined) {
        game.lastRendered = timestamp;
        game.lastTimestamp = timestamp;
    }

    let delta = (timestamp - game.lastTimestamp) / (10 / Game.GAME_SPEED);

    game.handlePhysics(delta, timestamp);
    game.updateCamera();
    game.render(timestamp);
    game.lastTimestamp = timestamp;

    if (game.canBeFinished()) {
        game.finish();
    }

    if (game.KeyLoad.isPressed()) {
        const dialog = new LoadLevelDialog();
        dialog.onClose = () => {
            dialog.close();
            game.isPaused = false;
            window.requestAnimationFrame(mainLoop);
        }
        dialog.onLoad = (data) => {
            EventBus.clear();
            loadLevel(Level.createFromJson(data));
        }

        game.isPaused = true;
    }

    window.requestAnimationFrame(mainLoop);
}

function loadLevel(level)
{
    const loader = new ImageLoader();
    loader.addImage(Setting.GRAPHICS_LOCATION + 'mr-croc-walk-right.png');
    loader.addImage(Setting.GRAPHICS_LOCATION + 'mr-croc-walk-left.png');
    loader.addImage(Setting.GRAPHICS_LOCATION + 'gisela-right.png');
    loader.addImage(Setting.GRAPHICS_LOCATION + 'gisela-left.png');
    loader.addImage(Setting.GRAPHICS_LOCATION + 'gisela-left.png');
    loader.addImage(Setting.GRAPHICS_LOCATION + 'giesela-left-sleeping.png');
    loader.addImage(Setting.GRAPHICS_LOCATION + 'giesela-right-sleeping.png');

    for (const graphicSet of GraphicSet) {
        loader.addImage(Setting.TILESET_LOCATION + graphicSet.tileset);

        if (graphicSet.backgroundImage !== null) {
            loader.addImage(Setting.GRAPHICS_LOCATION + graphicSet.backgroundImage);
        }
    }

    loader.load();

    EventBus.addEventListener(
        'imagesloaded',
        () => {
            game = new Game(level);
            game.init(mainLoop);
        }
    );
}

const LEVEL = [
    'level01.json',
    'moon.json',
    'moonbase.json',
    'terrain8.json',
    'darius.json',
    'imperial-prison.json',
];

let game;

const urlGetter = new UrlParam();
const levelIndex = urlGetter.getInt('level');

Level.createFromFile(
    Setting.LEVELS_LOCATION + LEVEL[levelIndex % LEVEL.length],
    (level) => {
        loadLevel(level);
    }
);