#include <Windows.h>
#include <wchar.h>

#include "kbGuru2SMF_config.h"
#include "kpi.h"

static const wchar_t SEC_GENERAL[] = L"General";
static const wchar_t KEY_GURU2SMF4_PATH[] = L"Guru2SMF4Path";
static const wchar_t GURU2SMF4_PATH_DEFAULT[] = L"";
extern HINSTANCE g_hKpi;
static void GetDefaultDllPath(wchar_t *pszPath, int nSize)
{//プラグインと同じフォルダの GuruGuruSMF4.dll
    wchar_t szPath[MAX_PATH];
    GetModuleFileName(g_hKpi, szPath, _countof(szPath));
    wchar_t* path_delimiter = wcsrchr(szPath, L'\\');
    if (path_delimiter) {
        path_delimiter[1] = 0;
    }
    wcsncat_s(szPath, L"GuruGuruSMF4.dll", _TRUNCATE);
    wcsncpy_s(pszPath, nSize, szPath, _TRUNCATE);
}
//////////////////////////////////////////////////////////////////////////////
BOOL __fastcall kbguru2smf_EnumConfig(IKpiConfig* pConfig, IKpiConfigEnumerator* pEnumerator)
{
    KPI_CFG_KEY key[] = {
    //   type, section, key, keydesc, default, min, max, list, listdesc, help
        {KPI_CFG_TYPE_FILE, SEC_GENERAL, KEY_GURU2SMF4_PATH, L"GuruGuruSMF4.dll のパス",
            NULL, L"GuruGuruSMF4.dll(*.dll)\t*.dll", NULL, //default/min/max
            GURU2SMF4_PATH_DEFAULT, L"同梱の GuruGuruSMF4.dll", //list/listdesc
            L"GuruGuruSMF4.dll の場所を指定します。\r\n"
            L"未指定にすると本プラグイン同梱の GuruGuruSMF4.dll を使用します。\r\n"
            L"同梱の GuruGuruSMF4.dll は v4.0.7 の改造版です。\r\n"
            L"\r\n"
            L"http://gurugurusmf.migmig.net/\r\n"
            L"\r\n"
            L"公式サイトの v4.0.7 では頻繁にフリーズして正しく動作しません。\r\n"
            L"v4.0.6 なら動作するようです。\r\n"
            L""}, //help
        {0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
    };
    for(int i = 0; key[i].cszSection; i++){
        pEnumerator->EnumKey(&key[i]);
    }
    return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
DWORD __fastcall kbguru2smf_ApplyConfig(IKpiConfig* pConfig,
    const wchar_t* cszSection, //セクション名
    const wchar_t* cszKey, //キー名
    INT64  nValue, //変更後の値(BOOL/INT の場合)
    double dValue, //変更後の値(FLOAT の場合)
    const wchar_t* cszValue)//変更後の値(文字列)
{
    if(wcscmp(cszSection, SEC_GENERAL) == 0){
        if(wcscmp(cszKey, KEY_GURU2SMF4_PATH) == 0){
        //プラグインと同じフォルダの GuruGuruSMF4.dll の場合は未指定にする
        //(バージョンアップ時に古い版の DLL を参照してしまうので)
            wchar_t szPath[MAX_PATH];
            GetDefaultDllPath(szPath, _countof(szPath));
            if(_wcsicmp(szPath, cszValue) == 0){
                pConfig->SetStr(SEC_GENERAL, KEY_GURU2SMF4_PATH, L"");//未指定にする
            }
            else{
                pConfig->SetStr(SEC_GENERAL, KEY_GURU2SMF4_PATH, cszValue);
            }
            return KPI_CFGRET_RELOAD_KPI;
        }
    }
    return KPI_CFGRET_OK;
}
//////////////////////////////////////////////////////////////////////////////
void __fastcall kbguru2smf_GetSettings(IKpiConfig* pConfig, kbguru2smf_Settings* pSettings)
{
    pConfig->GetStr(SEC_GENERAL, KEY_GURU2SMF4_PATH, pSettings->szDllPath,
        sizeof(pSettings->szDllPath), L"");
    if(!pSettings->szDllPath[0]){
    //プラグインと同じフォルダの GuruGuruSMF4.dll
        GetDefaultDllPath(pSettings->szDllPath, _countof(pSettings->szDllPath));
    }
}
