#include <windows.h>
#include <wchar.h>

#include "kpi.h"
#include "kbfmp7_config.h"

static const wchar_t SEC_GENERAL[] = L"General";
static const wchar_t KEY_FMP7_PATH[] = L"FMP7Path";
static const wchar_t KEY_CLOSE_FMP7[] = L"CloseFMP7";

static const int CLOSE_FMP7_DEFAULT = 0;
static const wchar_t SZ_CLOSE_FMP7_DEFAULT[] = L"0";

//////////////////////////////////////////////////////////////////////////////
BOOL __fastcall kbfmp7_EnumConfig(IKpiConfig* pConfig, IKpiConfigEnumerator* pEnumerator)
{
    static const KPI_CFG_KEY key[] = {
        //   type, section, key, keydesc, default, min, max, list, listdesc, help
        {KPI_CFG_TYPE_FILE, SEC_GENERAL, KEY_FMP7_PATH, L"FMP7.exe のパス",
            NULL, L"FMP7.exe(*.exe)\t*.exe", NULL, //default/min/max
            NULL, //list
            NULL, //listdesc
            L"FMP7.exe のパスを指定します。\r\n"
            L"\r\n"
            L"http://archive.fmp.jp/archives/category/program\r\n"
            L"\r\n"
            L"動作確認したバージョンは v7.10g です。\r\n"
            L"FMP7 の起動時に一瞬だけ音が鳴る場合は FMP7 の設定の「ドライバ」タブを\r\n"
            L"選択して「起動ジングル演奏」のチェックを外して下さい。\r\n"
            L""},//help
        {KPI_CFG_TYPE_INT, SEC_GENERAL, KEY_CLOSE_FMP7, L"FMP7 の終了",
            SZ_CLOSE_FMP7_DEFAULT, NULL, NULL, //default/min/max
            L"0\t1\t2", //list
            L"プラグインアンロード時\t曲を閉じる都度\t終了しない", //listdesc
            L"FMP7 をいつ終了するかの設定\r\n"
            L"0: プラグインのアンロード時に終了\r\n"
            L"1: 曲データを閉じる度に終了\r\n"
            L"2: 終了しない\r\n"
            L"\r\n"
            L"0 の場合、曲データを閉じても本体がプラグインをアンロードするまでFMP7が起動し続けます。\r\n"
            L"1 の場合、0 に比べると曲の切り替えや情報取得が低速になります。\r\n"
            L"2 の場合は手動で FMP7 を終了する必要があります。\r\n"
            L""},//help
        {0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
    };
    for (int i = 0; ; i++) {
        if(!key[i].cszSection)break;
        pEnumerator->EnumKey(&key[i]);
    }
    return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
DWORD __fastcall kbfmp7_ApplyConfig(IKpiConfig* pConfig,
    const wchar_t* cszSection, //セクション名
    const wchar_t* cszKey, //キー名
    INT64  nValue, //変更後の値(BOOL/INT の場合)
    double dValue, //変更後の値(FLOAT の場合)
    const wchar_t* cszValue)//変更後の値(文字列)
{
    if(!cszKey[0]){return KPI_CFGRET_OK;}
    pConfig->SetStr(cszSection, cszKey, cszValue);
    if(wcscmp(cszKey, KEY_FMP7_PATH) == 0){
        return KPI_CFGRET_RELOAD_KPI;
    }
    return KPI_CFGRET_OK;
}
//////////////////////////////////////////////////////////////////////////////
void __fastcall kbfmp7_GetSettings(IKpiConfig* pConfig, kbfmp7_Settings* pSettings)
{
    pConfig->GetStr(SEC_GENERAL, KEY_FMP7_PATH, pSettings->szFMP7Path, sizeof(pSettings->szFMP7Path), L"");
    pSettings->nCloseFMP7 = pConfig->GetInt(SEC_GENERAL, KEY_CLOSE_FMP7, CLOSE_FMP7_DEFAULT);
    switch(pSettings->nCloseFMP7){
        case 0: case 1: case 2:break;
        default: pSettings->nCloseFMP7 = CLOSE_FMP7_DEFAULT;break;
    }
}
//////////////////////////////////////////////////////////////////////////////
