/******************************************************************************
*	File		-	main.cpp
*	Author		-	Joey Pollack
*	Date		-	2021/09/03 (y/m/d)
*	Mod Date	-	2021/09/03 (y/m/d)
*	Description	-	Main entry-point for Lunarium
******************************************************************************/

#include <core/core.h>
#include <utils/logger.h>
#include <utils/helpers.h>
#include <iostream>
#include <filesystem>


int main(int argc, char** argv)
{
    // Switch the currrent working directory to the directory
    // containing the lunarium.exe file because the data and state
    // file should be in that location
    std::string path = argv[0];
    path = lunarium::String::TrimFileNameFromPath(path);
    std::filesystem::current_path(path);


// TODO: This could be made nicer...
    u32 ll = lunarium::LogLevel::FATAL_ERROR | lunarium::LogLevel::ERROR;
#if LOG_LEVEL == 2
    ll = lunarium::LogLevel::FATAL_ERROR | lunarium::LogLevel::ERROR | lunarium::LogLevel::WARNING | lunarium::LogLevel::INFO;
#endif
#if LOG_LEVEL == 3
    ll = lunarium::LogLevel::ANY & ~(lunarium::LogLevel::GRAPHICS_INTERNAL_DEBUG | lunarium::LogLevel::GRAPHICS_INTERNAL_ERROR);
#endif
#if LOG_LEVEL == 4
    ll = lunarium::LogLevel::ANY & ~(lunarium::LogLevel::GRAPHICS_INTERNAL_ERROR);
#endif
#if LOG_LEVEL == 5
    ll = lunarium::LogLevel::ANY;
#endif

    // All log messages will go to stdout
    lunarium::Logger::GetInstance()->AddListener(new lunarium::CoreLogListener(
                            ll, lunarium::LogCategory::ANY));

    lunarium::Core& core = lunarium::Core::GetInstance();
    core.Initialize(argc, argv);

    if (!core.IsInit())
    {
        std::cout << "\nFailed to initialize the engine core.\n";
        return 1;
    }

    //std::cout << "\nEngine core successfully initialized!\n";

    core.RunGameLoop();

    core.Shutdown();
    lunarium::Logger::GetInstance()->FreeAllListeners();
    lunarium::Logger::FreeInstance();
    std::cout << "\n";
    return 0;
}