#pragma once

class IKpiConfig;
class NSFDialogManager;
class NSFplug_Model;

//NSFplug のダイアログは全て本クラス内で作成するスレッド内で作成＆アクセスする
//(ダイアログを作成したスレッドを破棄するとダイアログも破棄されて表示されなくなってしまう)
class KbNsfplugUIThread
{
private:
    static bool s_bResetPos;//ダイアログの位置とサイズを初期値に戻す場合は true
    HANDLE  m_hThread;
    HANDLE  m_hEventCmd; //コマンド発行待ち用イベント
    HANDLE  m_hEventDone;//コマンド処理待ち用イベント
    enum{
        CMD_CREATE = 0,
        CMD_DELETE,
        CMD_OPEN_DLG,
        CMD_HIDE_DLG,
        CMD_START_TRACK,
        //CMD_STOP_TRACK,
        CMD_START_MEMORY,
        //CMD_STOP_MEMORY,
        CMD_SET_INFODATA,
        CMD_EXIT,
    };
    struct{
        int    nCommand;
        WPARAM wParam;
        LPARAM lParam;
        LPARAM lResult;
    }m_Command;
    IKpiConfig       *m_pConfig;
    NSFDialogManager *m_pCache;//演奏情報等のキャッシュ
    CRITICAL_SECTION m_cs;
    void __fastcall Lock(){EnterCriticalSection(&m_cs);}
    void __fastcall Unlock(){LeaveCriticalSection(&m_cs);}
    static unsigned WINAPI ThreadProc(void *pThis);
    unsigned __fastcall ThreadProc(void);
    LRESULT __fastcall SendCommand(int nCommand, WPARAM wParam, LPARAM lParam);
    void __fastcall SaveDialogPos(NSFDialogManager *pManager);
    void __fastcall LoadDialogPos(NSFDialogManager *pManager);
public:
    KbNsfplugUIThread(IKpiConfig *pConfig);
    ~KbNsfplugUIThread(void);
    //↓mode の意味がオリジナルと異なる(NSFDialogs.h/cpp::NSFDialogManager のコンストラクタを修正している)
    //mode==0: 曲データごとの情報表示(演奏情報、メモリ表示、プロパティ)
    //mode==1: ↑以外の曲データに依らない設定(詳細設定、音量バランス、チャンネルマスク、チャンネルミキサー、簡易設定、プリセット)
    NSFDialogManager* CreateManager(NSFplug_Model *pModel, int mode);
    void DeleteManager(NSFDialogManager* pManager);
    void OpenDialog(NSFDialogManager *pManager, int id);
    void HideDialog(NSFDialogManager *pManager, int id);
    void StartTrack(NSFDialogManager *pManager);
    void StartMemory(NSFDialogManager *pManager);
    void SetInfoData(NSFDialogManager *pManager,  xgm::NSF *pNsf);
    static void ResetPos(void);
};