#include "internal.hpp"
#include "vkvm.hpp"
#include "../src/Bitmap.hpp"
#include "../src/MathFunctions.hpp"
#include <unistd.h>

//time to sleep for in seconds
constexpr int sleepTime = 10;

void displayImage(const std::string &file, vkvm::GraphicMode graphicMode) {
    vkvm::setMode(graphicMode);
    Bitmap image(file);
    vkvm::setWidth(image.getWidth());
    vkvm::setHeight(image.getHeight());
    for (int x = 0; x < vkvm::getWidth(); x++) {
        for (int y = 0; y < vkvm::getHeight(); y++) {
            unsigned int hex = image.getPixel(x, y);
            vkvm::Color color = vkvm::Color(hex);
            vkvm::setPixel(x, y, color);
        }
    }
}

void setColor(vkvm::Color color) {
    for (int x = 0; x < vkvm::getWidth(); ++x) {
        for (int y = 0; y < vkvm::getHeight(); ++y) {
            vkvm::setPixel(x, y, color);
        }
    }
}

void displayImage(const std::string &file) {
    displayImage(file, vkvm::GraphicMode::RGB);
    vkvm::callEvent(vkvm::EventType::Redraw);
    sleep(sleepTime);
    vkvm::setMode(vkvm::GraphicMode::Gray_256);
    vkvm::callEvent(vkvm::EventType::Redraw);
    sleep(sleepTime);
    vkvm::setMode(vkvm::GraphicMode::TwoColors);
    vkvm::callEvent(vkvm::EventType::Redraw);
    sleep(sleepTime);
}

int main() {
    bool running = true;
    vkvm::initialize(0);

    while(running) {
        displayImage("../res/P6.bmp");
        sleep(sleepTime);
        vkvm::setBackgroundColor(vkvm::red);
        vkvm::setForegroundColor(vkvm::blue);
        vkvm::callEvent(vkvm::EventType::Redraw);
        sleep(sleepTime);
        vkvm::setBackgroundColor(vkvm::black);
        vkvm::setForegroundColor(vkvm::white);
        vkvm::callEvent(vkvm::EventType::Redraw);

        displayImage("../res/P8.bmp");

        displayImage("../res/P9.bmp");

        displayImage("../res/P10.bmp");

        vkvm::setText("Hello World");
        sleep(sleepTime);
        vkvm::setFont(vkvm::FontType::FuturisticBlack);
        vkvm::callEvent(vkvm::EventType::RenderText);
        sleep(sleepTime);
        vkvm::setText("Hello World, lorem ipsum dolor sit amet");
        sleep(sleepTime);
        vkvm::setFont(vkvm::FontType::ProFontIIX);
        vkvm::callEvent(vkvm::EventType::RenderText);
        sleep(sleepTime);

        mandelbrot();
        sleep(sleepTime);

        sleep(sleepTime);
        setColor(vkvm::black);
        sleep(sleepTime);

    }



}
