#pragma once
#include "logedit.h"
#include "afxcmn.h"
#include "afxmt.h"

// CManualPatchPage 대화 상자입니다.
class CPMSetting;


struct MPProgressData
{
    CList<CString>      m_ProgressList;
    CList<CString>      m_ErrorList;
    CList<CString>      m_TotalProgressList;

    ULONGLONG           m_dwTotalFileSize;
    ULONGLONG           m_dwCurrentFileSize;
    int                 m_nTotalFiles;
    int                 m_nAddedFiles;
    BOOL                m_bStopWorkerThread;
};

class CManualPatchPage : public CPropertyPage
{
    DECLARE_DYNAMIC(CManualPatchPage)

public:
    CManualPatchPage(CPMSetting& pmSetting, DWORD dwPatchVersion);
    virtual ~CManualPatchPage();

// 대화 상자 데이터입니다.
    enum { IDD = IDD_MANUAL_PATCH };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.

    DECLARE_MESSAGE_MAP()

public:

    // 패치 상태를 업데이트한다.
    void UpdateManualPatchStatus(MPProgressData& progressData);

private:

    // 패치 작업 스레드
    static unsigned __stdcall ManualPatchWorker(void* pArg);

    // 패치 작업 스레드 관련 함수
    void InitMPWorkerData();
    void StopWorker();

    // 이벤트 처리 함수들
    afx_msg void OnBnClickedMpCreate();
    afx_msg void OnBnClickedMpCancel();
    afx_msg void OnBnClickedBtnMpSelectFile();
    afx_msg void OnTimer(UINT_PTR nIDEvent);
    afx_msg void OnBnClickedClearLog();

    virtual BOOL OnInitDialog();
    virtual BOOL OnSetActive();
    afx_msg void OnClose();
    
    CPMSetting& m_pmSettingOption;

    CString     m_szMPFolder;
    CString     m_szMPSFXFile;
    CString     m_szMPFileName;
    CString     m_szPatchType;

    CLogEdit    m_edProgressLog;
    CLogEdit    m_edErrLog;

    DWORD       m_dwMPMaxver;
    DWORD       m_dwMPMinver;

    HANDLE      m_hManualPatchThread;

    CString             m_szFileProgress;
    CProgressCtrl       m_TotalProgressBar;

    // 크리티컬 섹션으로 보호되는 부분.
    CCriticalSection    m_ProgressLock;
    MPProgressData      m_ProgressData;
};
