#include <windows.h>
#include "kmp_pi.h"
#include "kbtim_common.h"
#include "kbstr.h"

#ifndef _DEBUG
#pragma comment(linker, "/opt:nowin98")  
#pragma comment(linker, "/nodefaultlib") 
#pragma comment(linker, "/entry:\"DllMain\"")
#endif

typedef KMPMODULE* (WINAPI *pfnTimGetModule)(HINSTANCE hInstance, DWORD dwVersion);

pfnTimGetModule  kbtim_GetModule;
static HINSTANCE g_hKpi;    //kbtim.kpi のインスタンスハンドル
static HINSTANCE g_hDll;    //kbtim.dll のインスタンスハンドル
static KMPMODULE *g_pModule;//kbtim.dll が返した KMPMODULE

BOOL APIENTRY DllMain(HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call){
        case DLL_PROCESS_ATTACH:{
            g_hKpi = (HINSTANCE)hModule;
            DisableThreadLibraryCalls((HMODULE)hModule);
            kbStr_Initialize();
            break;
        }
        case DLL_PROCESS_DETACH:{
            break;
        }
    }
    return TRUE;
}

static void WINAPI kmp_Init(void)
{
    if(g_pModule->Init){
        g_pModule->Init();
    }
}
static void WINAPI kmp_Deinit(void)
{
    if(g_hDll){
        if(g_pModule->Deinit){
            g_pModule->Deinit();
        }
        FreeLibrary(g_hDll);
        g_hDll = NULL;
    }
}

KMPMODULE* WINAPI kmp_GetTestModule(void)
{
    static KMPMODULE Module;
    static KMPMODULE *pModule;
    if(!pModule){
        //kbtim_GetModule は 1 回しか呼んではいけない
        char szKbTimKpi[MAX_PATH*2];
        char szKbTimDll[MAX_PATH*2];
        GetModuleFileName(g_hKpi, szKbTimKpi, sizeof(szKbTimKpi));
        kbExtractFilePath(szKbTimDll, szKbTimKpi, sizeof(szKbTimDll));
        kbStrLCat(szKbTimDll, "kbtim.dll", sizeof(szKbTimDll));
        HINSTANCE hDll = LoadLibrary(szKbTimDll);
        if(!hDll){
            return NULL;
        }
        kbtim_GetModule = (pfnTimGetModule)GetProcAddress(hDll, "kbtim_GetModule");
        if(!kbtim_GetModule){
            FreeLibrary(hDll);
            return NULL;
        }
        pModule = kbtim_GetModule(g_hKpi, KBTIM_GETMODULE_VERSION);
        if(!pModule){
            FreeLibrary(hDll);
            return NULL;
        }
        else{
            g_pModule = pModule;
            memcpy(&Module, pModule, sizeof(KMPMODULE));
            Module.Init = kmp_Init;
            Module.Deinit = kmp_Deinit;
            pModule = &Module;
            g_hDll = hDll;
        }
    }
    return pModule;
}
DWORD WINAPI kmp_Config(HWND hWnd, DWORD dwVersion, DWORD dwReserved)
{
    if(dwVersion == 0){
        //プラグインと同じフォルダにある kbtimsetup.exe を起動する
        //コマンドラインパラメータとして、自分自身(kbtim(_xxx).kpi) のフルパスを渡す
        char szKbTimKpi[MAX_PATH*2];       //X:\...\kbtim(_xxx).kpi
        char szKbTimSetupExe[MAX_PATH*2];  //X:\...\kbtimsetup.exe
        char szKbTimSetupParam[MAX_PATH*2];//"X:\...\kbtim(_xxx).kpi"
        //*.kpi
        GetModuleFileName(g_hKpi, szKbTimKpi, sizeof(szKbTimKpi));
        //kbtimsetup.exe
        kbExtractFilePath(szKbTimSetupExe, szKbTimKpi, sizeof(szKbTimSetupExe));
        kbStrLCat(szKbTimSetupExe, "kbtimsetup.exe", sizeof(szKbTimSetupExe));
        //コマンドラインパラメータ("" で括る)
        szKbTimSetupParam[0] = '"';
        szKbTimSetupParam[1] = 0;
        kbStrLCat(szKbTimSetupParam, szKbTimKpi, sizeof(szKbTimSetupParam)); 
        kbStrLCat(szKbTimSetupParam, "\"", sizeof(szKbTimSetupParam));
        ShellExecute(NULL, "open", szKbTimSetupExe, szKbTimSetupParam, NULL, SW_SHOWNORMAL);
    }
    return 0;
}
