/**************************************************************************
作者: huangjiangbo
时间: 2024.08.26
描述: 各模组Config数据库操作基类

修改记录:
1、
***************************************************************************/

#pragma once
//#pragma warning(disable:4251)
#include "CppSQLite3.h"
#include "dt.h"
#include <string>
#include <windows.h>
#include <vector>
#include <mutex>
#include "CDataBaseOperate.h"

namespace ns_db
{
	using namespace std;

#ifdef CONFIG_BASE_DLL
#define DLL_CONFIG_BASE_API  __declspec(dllexport)
#else
#define DLL_CONFIG_BASE_API
#endif

	typedef struct _CONFIG_BASE_STRUCT
	{
		INT iNo_;
		INT iGroupId = 1;
		string strName = "";
		string strDescribe = "";
		string strDescribe_Eng = "";
		INT iUserGrade = 1;
		INT iChangeFlag = 1;
		string strValue = "";
		string strType = "";
		string strDefult = "";
		string strLowerLimit = "-1000000";
		string strUpperLimit = "1000000";
		string strUnit = "um";
		string strAxisType = "";
		string sIcon = "";
		bool bEnable = true;
		string strCallFun = "";
	}CONFIG_BASE_STRUCT;

	enum CONFIG_TYPE
	{
		CONFIG_LONG = 0,
		CONFIG_ULONG,
		CONFIG_INT,
		CONFIG_DOUBLE,
		CONFIG_BOOL,
		CONFIG_STRING
	};

	typedef struct _MODULE_CONFIG_STRUCT
	{
		string strName;
		void* pValue;
		CONFIG_TYPE config_type;
		bool bSave;
		void* pDefault;
		_MODULE_CONFIG_STRUCT(string strTemp, LONG* pTemp, bool isSaveTemp, LONG* pDef = NULL)
		{
			strName = strTemp;
			pValue = (void*)pTemp;
			config_type = CONFIG_TYPE::CONFIG_LONG;
			bSave = isSaveTemp;
			pDefault = (void*)pDef;
		}
		_MODULE_CONFIG_STRUCT(string strTemp, ULONG* pTemp, bool isSaveTemp, ULONG* pDef = NULL)
		{
			strName = strTemp;
			pValue = (void*)pTemp;
			config_type = CONFIG_TYPE::CONFIG_ULONG;
			bSave = isSaveTemp;
			pDefault = (void*)pDef;
		}
		_MODULE_CONFIG_STRUCT(string strTemp, int* pTemp, bool isSaveTemp, int* pDef = NULL)
		{
			strName = strTemp;
			pValue = (void*)pTemp;
			config_type = CONFIG_TYPE::CONFIG_INT;
			bSave = isSaveTemp;
			pDefault = (void*)pDef;
		}
		_MODULE_CONFIG_STRUCT(string strTemp, unsigned int* pTemp, bool isSaveTemp, unsigned int* pDef = NULL)
		{
			strName = strTemp;
			pValue = (void*)pTemp;
			config_type = CONFIG_TYPE::CONFIG_INT;
			bSave = isSaveTemp;
			pDefault = (void*)pDef;
		}
		_MODULE_CONFIG_STRUCT(string strTemp, double* pTemp, bool isSaveTemp, double* pDef = NULL)
		{
			strName = strTemp;
			pValue = (void*)pTemp;
			config_type = CONFIG_TYPE::CONFIG_DOUBLE;
			bSave = isSaveTemp;
			pDefault = (void*)pDef;
		}
		_MODULE_CONFIG_STRUCT(string strTemp, bool* pTemp, bool isSaveTemp, bool* pDef = NULL)
		{
			strName = strTemp;
			pValue = (void*)pTemp;
			config_type = CONFIG_TYPE::CONFIG_BOOL;
			bSave = isSaveTemp;
			pDefault = (void*)pDef;
		}
		_MODULE_CONFIG_STRUCT(string strTemp, string* pTemp, bool isSaveTemp, string* pDef = NULL)
		{
			strName = strTemp;
			pValue = (void*)pTemp;
			config_type = CONFIG_TYPE::CONFIG_STRING;
			bSave = isSaveTemp;
			pDefault = (void*)pDef;
		}

	}MODULE_CONFIG_STRUCT;

	// 定义函数指针类型
	using GetFunctionPtr = vector<CONFIG_BASE_STRUCT>(*)();
	using SetFunctionPtr = std::function<LONG(CDataBaseOperate*, std::vector<CONFIG_BASE_STRUCT>)>;

	typedef struct 
	{
		GetFunctionPtr get;
		SetFunctionPtr set;
	} CONFIG_FUNCTION_PTR;


	class DLL_CONFIG_BASE_API CConfigBase
	{
	private:
		// 函数注册表
		std::map<std::string, CONFIG_FUNCTION_PTR> m_FunctionRegistry;

	public:
		// 注册函数
		void RegisterFunction(const std::string& name,GetFunctionPtr get, SetFunctionPtr set);
		LONG CallSetFunction(const std::string& name, CDataBaseOperate* obj, std::vector<CONFIG_BASE_STRUCT> vecconfig);
		
		CConfigBase(string sPathFile, CppSQLite3DB* pDB);

		LONG LoadConfigDB(string strTableName, vector<CONFIG_BASE_STRUCT>& vecConfig);
		LONG SaveConfigDB(string strTableName, vector<CONFIG_BASE_STRUCT>* vecConfig);

		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 Append(vector<CONFIG_BASE_STRUCT>* stConfig, MODULE_CONFIG_STRUCT config);

		//在ConfigBase 中查找 ModuleConfig 中需要的数据
		LONG GetConfigParam(vector<CONFIG_BASE_STRUCT> stConfig, vector<MODULE_CONFIG_STRUCT>* vecconfig);

		//将ModuleConfig的数据设置到ConfigBase中
		LONG SetConfigParam(vector<CONFIG_BASE_STRUCT>* stConfig, vector<MODULE_CONFIG_STRUCT> vecconfig);

	private:
		CppSQLite3DB* m_pDB;
		std::string     m_sPathFile = "";

	};


}