#include "game/scenes/boot_loader_scene.hpp"

#include "core/jail/jdraw8.hpp"
#include "core/resources/resource_cache.hpp"
#include "game/options.hpp"

namespace Scenes {

    namespace {
        constexpr int SCREEN_W = 320;

        constexpr Uint8 BG_COLOR = 0;   // negre
        constexpr Uint8 BAR_COLOR = 1;  // blanc

        constexpr int BAR_X = 60;
        constexpr int BAR_Y = 170;
        constexpr int BAR_W = SCREEN_W - (BAR_X * 2);  // 200
        constexpr int BAR_H = 6;
    }  // namespace

    BootLoaderScene::BootLoaderScene() = default;

    void BootLoaderScene::onEnter() {
        // Inicialitza la paleta mínima per a la barra. La resta de
        // colors queden a negre — després cada escena del joc carregarà
        // la seua pròpia paleta.
        Jd8::setPaletteColor(BG_COLOR, 0, 0, 0);
        Jd8::setPaletteColor(BAR_COLOR, 63, 63, 63);
    }

    void BootLoaderScene::tick(int /*delta_ms*/) {
        if (Resource::Cache::get()->loadStep(8)) {
            done_ = true;
        }
        render();
    }

    void BootLoaderScene::render() {
        Jd8::clearScreen(BG_COLOR);

        if (!Options::game.show_preload) {
            return;
        }

        const float PCT = Resource::Cache::get()->getProgress();
        const int FILLED = static_cast<int>(static_cast<float>(BAR_W) * PCT);

        // Vora de la barra (línia 1 píxel a dalt i a baix).
        Jd8::fillRect(BAR_X - 1, BAR_Y - 1, BAR_W + 2, 1, BAR_COLOR);
        Jd8::fillRect(BAR_X - 1, BAR_Y + BAR_H, BAR_W + 2, 1, BAR_COLOR);
        Jd8::fillRect(BAR_X - 1, BAR_Y, 1, BAR_H, BAR_COLOR);
        Jd8::fillRect(BAR_X + BAR_W, BAR_Y, 1, BAR_H, BAR_COLOR);

        // Ompliment proporcional al progrés.
        if (FILLED > 0) {
            Jd8::fillRect(BAR_X, BAR_Y, FILLED, BAR_H, BAR_COLOR);
        }
    }

}  // namespace Scenes
