#include "core/stdafx.h"
#include "core/r5dev.h"
#include "core/init.h"
#include "core/logdef.h"
/*****************************************************************************/
#ifndef DEDICATED
#include "windows/id3dx.h"
#include "windows/input.h"
#endif // !DEDICATED
#include "windows/console.h"
#include "windows/system.h"
#include "launcher/launcher.h"

//#############################################################################
// INITIALIZATION
//#############################################################################

void R5Dev_Init()
{
    if (strstr(GetCommandLineA(), "-launcher"))
    {
        g_svCmdLine = GetCommandLineA();
    }
    else
    {
        g_svCmdLine = LoadConfigFile(SDK_DEFAULT_CFG);
    }
#ifndef DEDICATED
    if (strstr(g_svCmdLine.c_str(), "-wconsole"))
    {
        Console_Init();
    }
#else
    Console_Init();
#endif // !DEDICATED
    SpdLog_Init();
    spdlog::info("\n");
    for (int i = 0; i < (&R5R_EMBLEM)[1] - R5R_EMBLEM; i++)
    {
        std::string svEscaped = StringEscape(R5R_EMBLEM[i]);
        spdlog::info("{}{}{}\n", g_svRedF.c_str(), svEscaped.c_str(), g_svReset.c_str());
    }
    spdlog::info("\n");

    Systems_Init();
    WinSys_Attach();

#ifndef DEDICATED
    Input_Init();
    DirectX_Init();
#endif // !DEDICATED
}

//#############################################################################
// SHUTDOWN
//#############################################################################

void R5Dev_Shutdown()
{
    static bool bShutDown = false;
    if (bShutDown)
    {
        spdlog::error("Recursive shutdown!\n");
        return;
    }
    bShutDown = true;
    spdlog::info("Shutdown GameSDK\n");

    Systems_Shutdown();
    WinSys_Detach();

#ifndef DEDICATED
    Input_Shutdown();
    DirectX_Shutdown();
#endif // !DEDICATED

    FreeConsole();
}

//#############################################################################
// ENTRYPOINT
//#############################################################################

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
        case DLL_PROCESS_ATTACH:
        {
            R5Dev_Init();
            break;
        }

        case DLL_PROCESS_DETACH:
        {
            R5Dev_Shutdown();
            break;
        }
    }

    return TRUE;
}
