#include <locale.h>
#include <string.h>

#include "../src/ErrorSimulator.hpp"
#include "Test.hpp"
#include "Tests.hpp"
#include "core/utils/ArrayString.hpp"
#include "core/utils/Utility.hpp"

static void onExit(int code, void* data) {
    unsigned int i = *static_cast<unsigned int*>(data);
    Core::ArrayString<1024> s;
    s.append("Hello from exit #: #");
    s.format(code, i);
    s.printLine();
    Core::print('A');
    Core::Test::finalize();
}

int main(int argAmount, const char** args) {
    setlocale(LC_ALL, "en_US.utf8");
    bool light = false;
    for(int i = 0; i < argAmount; i++) {
        if(strcmp(args[i], "light") == 0) {
            light = true;
        }
    }
    Core::testArrayList(light);
    Core::testArrayString();
    Core::testArray();
    Core::testBitArray();
    Core::testBox();
    Core::testBuffer(light);
    Core::testBufferedValue();
    Core::testClock(light);
    Core::testColor();
    Core::testComponents();
    Core::testError();
    Core::testFileReader();
    Core::testFrustum();
    Core::testHashedString();
    Core::testHashMap(light);
    Core::testLinkedList(light);
    Core::testList(light);
    Core::testMath();
    Core::testMatrixStack(light);
    Core::testMatrix();
    Core::testNew();
    Core::testPlane();
    Core::testQuaternion();
    Core::testRandom(light);
    Core::testRingBuffer();
    Core::testStack(light);
    Core::testThread();
    Core::testUniquePointer();
    Core::testUtility();
    Core::testVector();
    Core::testView();

    Core::Logger::level = Core::Logger::Level::WARNING;
    CORE_LOG_DEBUG("You won't see this!");
    Core::Logger::level = Core::Logger::Level::DEBUG;

    unsigned int data = 123456789;
    Core::setExitHandler(onExit, &data);

    CORE_EXIT(1);
    return 0;
}