#pragma once
#include "Defines.h"
#include "Ini.h"

class CConfig
{
	public:
		//Rom модули
		CString m_strBK10_017_Monitor,
		        m_strBK10_018_Focal,
		        m_strBK10_019_MSTD,
		        m_strBK10_106_basic1,
		        m_strBK10_107_basic2,
		        m_strBK10_108_basic3,
		        m_strBK11_201_bos,
		        m_strBK11_202_ext,
		        m_strBK11_203_mstd,
		        m_strBK11_198_basic1,
		        m_strBK11_199_basic2,
		        m_strBK11_200_basic3,
		        m_strBK11m_324_bos,
		        m_strBK11m_325_ext,
		        m_strBK11m_330_mstd,
		        m_strBK11m_327_basic1,
		        m_strBK11m_328_basic2,
		        m_strBK11m_329_basic3,
		        m_strFDD_Std,
		        m_strFDD_A16M,
		        m_strFDD_SMK512;
		//Директории
		CString m_strBinPath,
		        m_strToolsPath,
		        m_strMemPath,
		        m_strSavesPath,
		        m_strTapePath,
		        m_strScriptsPath,
		        m_strROMPath,
		        m_strIMGPath,
		        m_strScreenShotsPath;

		//Параметры
		CString m_strBKBoardType;
		WORD    m_nCPURunAddr;
		int     m_nCPUFrequency,
		        m_nRegistersDumpInterval,
		        m_nScreenshotNumber,
		        m_nSoundVolume,
		        m_nScreenRenderType,
		        m_nOscRenderType;
		double  m_fCurrentCPUSpeed;

		//Опции
		BOOL    m_bSavesDefault;
		BOOL    m_bSpeaker,
		        m_bSpeakerFilter,
		        m_bCovox,
		        m_bCovoxFilter,
		        m_bStereoCovox,
		        m_bAY8910,
		        m_bAY8910Filter,
		        m_bBKKeyboard,
		        m_bJoystick,

		        m_bColorMode,
		        m_bAdaptBWMode,
		        m_bFullscreenMode,

		        m_bPauseCPUAfterStart,
		        m_bAskForBreak, /*при чтении/записи из несуществующего адреса не прерываться.
                                    (полезно для отладки и не полезно для работы эмулятора)
                                    */
		        m_bEmulateLoadTape,
		        m_bEmulateSaveTape,
		        m_bTapeAutoBeginDetection,
		        m_bTapeAutoEnsDetection,

		        m_bShowPerformance,
		        m_bEmulateFDDIO;

		WORD    m_nAdrDump,
		        m_nAdrAsm;
		int     m_nVKBDType;

		//Приводы
		CString m_strDrives[4];
		CString m_strHDDrives[2];

//остальные параметры, которые желательно должны быть доступны глобально.
		OSVERSIONINFOEX m_osvi; //структура с версией винды
		BK_FDD_MODEL    m_BKFDDModel; //переменная-посредник, сюда помещается номер модели дисковода перед созданием
		// конфигурации и используется во время создания конфигурации, в остальное время - не нужно.

	protected:
		CIni            iniFile; //наш распарсенный ини файл
		CString         m_strCurrentPath; //путь к проге
		CString         m_strIniFilePath; //полное имя ини файла, с путём

		CString         _GetCurrentPath();
		void            DefaultConfig();
		BOOL            GetWindowVersion();

	public:
		CConfig();
		virtual ~CConfig();
		void            InitConfig(const CString &strIniName);
		void            UnInitConfig();

		inline CIni    *GetIniObj()
		{
			return &iniFile;
		}

		CString         GetDriveImgName(int nDrive);
		void            SetDriveImgName(int nDrive, const CString &strPathName);
		CString         GetHDDriveImgName(int nDrive);
		const CString   &GetCurrentPath();
		CString         &NormalizePath(CString &strPath);
		CString         GetFilePath(const CString &strPath);
		CString         GetFileTitle(const CString &strPath);
		CString         GetFileName(const CString &strPath);
		CString         GetFileExt(const CString &strPath);
		void            LoadConfig(BOOL bLoadFromMemory = FALSE, BYTE *pBuff = NULL, UINT nSize = 0);
		ULONGLONG       SaveConfig(BOOL bSaveToMemory = FALSE, BYTE *pBuff = NULL, UINT nSize = 0);
		BOOL            VerifyRoms();
		int             GetBKModelNumber();
		void            SetBKModelNumber(int n);
};

