#pragma once
#include "CppSQLite3.h"
#include "dt.h"
#include <string>
#include <windows.h>
#include <mutex>

#include "CConfigBase.h"
#include "CDataBaseOperate.h"

namespace ns_db
{

	using namespace std;

#ifdef MODULE_CONFIG_DLL
#define DLL_MODULE_CONFIG_API __declspec(dllexport)
#else
#define DLL_MODULE_CONFIG_API
#endif

#define MODULECONFIG_DATABASE_NAME					ROOT_PATH##"\\db\\ModuleConfig.db"
#define BONDHEAD_CONFIG_TABLE_NAME					"EutecticHead"
#define WAFERHEAD_CONFIG_TABLE_NAME					"WaferHead"
#define WAFFLEHEAD_CONFIG_TABLE_NAME				"WaffleHead"
#define EJECTOR_CONFIG_TABLE_NAME					"Ejector"
#define WAFERTABLE_CONFIG_TABLE_NAME				"WaferTable"
#define WAFER_CALIB_TABLE_CONFIG_TABLE_NAME			"WaferCalibTable"
#define WAFFLE_CALIB_TABLE_CONFIG_TABLE_NAME		"WaffleCalibTable"
#define BOND_TABLE_CONFIG_TABLE_NAME				"BondTable"
#define NOZZLE_TABLE_CONFIG_TABLE_NAME				"NozzleTable"
#define HARDWARE_SWICH_TABLE_NAME					"HardwareSwich"
#define ULTRAHEAD_TABLE_NAME						"UltraHead"

	

	class DLL_MODULE_CONFIG_API CModuleConfig : public CDataBaseOperate
	{
	public:
		CModuleConfig();

		LONG GetConfigParam(string strTableName, vector<MODULE_CONFIG_STRUCT>& vecConfig);
		LONG GetConfigParam(string strTableName, vector<CONFIG_BASE_STRUCT>& vecConfig);

		LONG SetConfigParam(string strTableName, vector<MODULE_CONFIG_STRUCT> vecconfig);
		LONG SetConfigParam(string strTableName, vector<CONFIG_BASE_STRUCT> vecconfig);

	private:
		std::unique_ptr<CConfigBase> m_ConfigBaseDb;

		LONG SaveDB() override;
		LONG LoadDB() override;

		/*LONG Read(vector<CONFIG_BASE_STRUCT> stConfig, const CHAR* key, string& value);
		LONG Read(vector<CONFIG_BASE_STRUCT> stConfig, const CHAR* key, CHAR* value, UINT len);
		LONG Read(vector<CONFIG_BASE_STRUCT> stConfig, const CHAR* key, LONG* value);
		LONG Read(vector<CONFIG_BASE_STRUCT> stConfig, const CHAR* key, ULONG* value);
		LONG Read(vector<CONFIG_BASE_STRUCT> stConfig, const CHAR* key, INT* value);
		LONG Read(vector<CONFIG_BASE_STRUCT> stConfig, const CHAR* key, DOUBLE* value);
		LONG Read(vector<CONFIG_BASE_STRUCT> stConfig, const CHAR* key, bool* value);

		LONG Write(vector<CONFIG_BASE_STRUCT>* stConfig, const CHAR* key, const CHAR* value);
		LONG Write(vector<CONFIG_BASE_STRUCT>* stConfig, const CHAR* key, string value);
		LONG Write(vector<CONFIG_BASE_STRUCT>* stConfig, const CHAR* key, LONG value);
		LONG Write(vector<CONFIG_BASE_STRUCT>* stConfig, const CHAR* key, ULONG value);
		LONG Write(vector<CONFIG_BASE_STRUCT>* stConfig, const CHAR* key, INT value);
		LONG Write(vector<CONFIG_BASE_STRUCT>* stConfig, const CHAR* key, DOUBLE value);
		LONG Write(vector<CONFIG_BASE_STRUCT>* stConfig, const CHAR* key, bool value);*/

		/*LONG GetConfigParam(vector<CONFIG_BASE_STRUCT> stConfig, vector<MODULE_CONFIG_STRUCT>* vecconfig);
		LONG SetConfigParam(vector<CONFIG_BASE_STRUCT>* stConfig, vector<MODULE_CONFIG_STRUCT> vecconfig);*/

#pragma region HardwareSwich
private:
		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_HardwareSwich;
	public:
		LONG GetConfigParam_HardwareSwich(string name,bool* flag);
		vector<CONFIG_BASE_STRUCT> GetConfigParam_HardwareSwich() { return m_vecConfig_HardwareSwich; };
		LONG SetConfigParam_HardwareSwich(vector<CONFIG_BASE_STRUCT> vecconfig);
		LONG SetConfigParam_HardwareSwich(vector<MODULE_CONFIG_STRUCT> vecconfig);
#pragma endregion	

#pragma region BondHead
private:
		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_BondHead;
	public:
		LONG GetConfigParam_BondHead(vector<MODULE_CONFIG_STRUCT>* vecconfig);
		vector<CONFIG_BASE_STRUCT> GetConfigParam_BondHead() { return m_vecConfig_BondHead; };
		LONG SetConfigParam_BondHead(vector<CONFIG_BASE_STRUCT> vecconfig);
		LONG SetConfigParam_BondHead(vector<MODULE_CONFIG_STRUCT> vecconfig);
#pragma endregion	


#pragma region WaferHead
	private:
		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_WaferHead;
	public:
		LONG GetConfigParam_WaferHead(vector<MODULE_CONFIG_STRUCT>* vecconfig);
		vector<CONFIG_BASE_STRUCT> GetConfigParam_WaferHead() { return m_vecConfig_WaferHead; };
		LONG SetConfigParam_WaferHead(vector<CONFIG_BASE_STRUCT> vecconfig);
		LONG SetConfigParam_WaferHead(vector<MODULE_CONFIG_STRUCT> vecconfig);
#pragma endregion

#pragma region WaffleHead
	private:
		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_WaffleHead;
	public:
		LONG GetConfigParam_WaffleHead(vector<MODULE_CONFIG_STRUCT>* vecconfig);
		vector<CONFIG_BASE_STRUCT> GetConfigParam_WaffleHead() { return m_vecConfig_WaffleHead; };
		LONG SetConfigParam_WaffleHead(vector<CONFIG_BASE_STRUCT> vecconfig);
		LONG SetConfigParam_WaffleHead(vector<MODULE_CONFIG_STRUCT> vecconfig);
#pragma endregion

#pragma region Ejector
	private:
		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_Ejector;
	public:
		LONG GetConfigParam_Ejector(vector<MODULE_CONFIG_STRUCT>* vecconfig);
		vector<CONFIG_BASE_STRUCT> GetConfigParam_Ejector() { return m_vecConfig_Ejector; };
		LONG SetConfigParam_Ejector(vector<CONFIG_BASE_STRUCT> vecconfig);
		LONG SetConfigParam_Ejector(vector<MODULE_CONFIG_STRUCT> vecconfig);
#pragma endregion

#pragma region WaferTable
	private:
		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_WaferTable;
	public:
		LONG GetConfigParam_WaferTable(vector<MODULE_CONFIG_STRUCT>* vecconfig);
		vector<CONFIG_BASE_STRUCT> GetConfigParam_WaferTable() { return m_vecConfig_WaferTable; };
		LONG SetConfigParam_WaferTable(vector<CONFIG_BASE_STRUCT> vecconfig);
		LONG SetConfigParam_WaferTable(vector<MODULE_CONFIG_STRUCT> vecconfig);
#pragma endregion

#pragma region CalibTable
	private:
		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_WaferCalibTable;
		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_WaffleCalibTable;
	public:
		//LONG GetConfigParamg_CalibTable(int moduleType, vector<MODULE_CONFIG_STRUCT>* vecconfig);
		LONG GetConfigParam_WaferCalibTable(vector<MODULE_CONFIG_STRUCT>* vecconfig);
		LONG GetConfigParam_WaffleCalibTable(vector<MODULE_CONFIG_STRUCT>* vecconfig);
		vector<CONFIG_BASE_STRUCT> GetConfigParam_WaferCalibTable() { return m_vecConfig_WaferCalibTable; };
		vector<CONFIG_BASE_STRUCT> GetConfigParam_WaffleCalibTable() { return m_vecConfig_WaffleCalibTable; };
		LONG SetConfigParam_WaferCalibTable(vector<MODULE_CONFIG_STRUCT> vecconfig);
		LONG SetConfigParam_WaffleCalibTable(vector<MODULE_CONFIG_STRUCT> vecconfig);
		LONG SetConfigParam_WaferCalibTable(vector<CONFIG_BASE_STRUCT> vecconfig);
		LONG SetConfigParam_WaffleCalibTable(vector<CONFIG_BASE_STRUCT> vecconfig);
		//LONG SetConfigParam_CalibTable(int moduleType, vector<MODULE_CONFIG_STRUCT> vecconfig);
#pragma endregion

#pragma region BondTable
	private:
		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_BondTable;
	public:
		LONG GetConfigParam_BondTable(vector<MODULE_CONFIG_STRUCT>* vecconfig);
		vector<CONFIG_BASE_STRUCT> GetConfigParam_BondTable() { return m_vecConfig_BondTable; };
		LONG SetConfigParam_BondTable(vector<CONFIG_BASE_STRUCT> vecconfig);
		LONG SetConfigParam_BondTable(vector<MODULE_CONFIG_STRUCT> vecconfig);
#pragma endregion

#pragma region NozzleTable
	private:
		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_NozzleTable;
	public:
		LONG GetConfigParam_NozzleTable(vector<MODULE_CONFIG_STRUCT>* vecconfig);
		vector<CONFIG_BASE_STRUCT> GetConfigParam_NozzleTable() { return m_vecConfig_NozzleTable; };
		LONG SetConfigParam_NozzleTable(vector<CONFIG_BASE_STRUCT> vecconfig);
		LONG SetConfigParam_NozzleTable(vector<MODULE_CONFIG_STRUCT> vecconfig);
#pragma endregion

#pragma region UltraHead
	private:
		std::vector<CONFIG_BASE_STRUCT>  m_vecConfig_UltraHead;
	public:
		LONG GetConfigParam_UltraHead(vector<MODULE_CONFIG_STRUCT>* vecconfig);
		vector<CONFIG_BASE_STRUCT> GetConfigParam_UltraHead() { return m_vecConfig_UltraHead; };
		LONG SetConfigParam_UltraHead(vector<CONFIG_BASE_STRUCT> vecconfig);
		LONG SetConfigParam_UltraHead(vector<MODULE_CONFIG_STRUCT> vecconfig);
#pragma endregion

	};



}