/***************************************************************************
                   Config Class Header ( DaemonConfigs.h )
                -----------------------------------------

	begin      : 2015/04/28
	copyright  : (C) 2013 Solbox Inc.
	author     : Development Team
	email      : storage.sd@solbox.com
	version    : 3.5.0

	CopyRight(C) 2005 Solbox Inc. All Rights reserved.
	Redistribution and use in source and binary forms, with or with out
	modification, are not permitted in outside of Solbox Inc.
***************************************************************************/
#ifndef __DAEMON_CONFIGS_H__
#define __DAEMON_CONFIGS_H__

#include <string>

using namespace std;

// fimngd 에서 캐시파일 조건을 약하게해서 요청하고 rc_rmcd의 최종 설정 값으로 조정하도록 한다.
#define		FD_COUNT  				                3   /// fd count
// 오픈된 fd를 찾는 쉘 스크립트 디폴트 설정값
#define		DEFAULT_CNT_CMD							"/user/service/etc/fdcnt.sh"
#define		CONTENT_EXPIRE_SEC                      300 /// hot content expire (sec)
#define		CONTENT_INFO_MAX						10000

class CDatabaseInfo
{
public:
	CDatabaseInfo() : m_nRcdbPort(0) {}
	~CDatabaseInfo() {}

public:
	string	m_szRcdbIp;
	int		m_nRcdbPort;
	string	m_szRcdbName;
	string	m_szRcdbAcct;
	string	m_szRcdbAcctPw;

};

class CCommonConfig
{
public:
	CCommonConfig( string szFilename, string szProgramName );
	virtual ~CCommonConfig();
	
	bool LoadConf();
	bool CheckValue();

	void PrintValue();

	inline	const char *	GetErrMessage()			{ return m_szErrMessage.c_str(); }

	inline const char *	GetConfigFile()			{ return m_szConfigFile.c_str(); }
	inline const char *	GetAppLogRoot()			{ return m_szAppLogRoot.c_str(); }
	inline int				GetAppLogLevel()		{ return m_nLogLevel; }
	inline CDatabaseInfo	GetDBInfo()				{ return m_cDatabaseInfo; } 
	inline const char*		GetRCID()				{ return m_szRcid.c_str(); }
	inline const char*		GetInternalNicName()	{ return m_szInternalNicName.c_str(); }
	inline const char*		GetFileStorageRoot()	{ return m_szFileStorageRoot.c_str(); }
	inline const char*		GetRctsServer()			{ return m_szRctsServer.c_str(); }
	inline int				GetAliveCheckPort()		{ return m_nAliveCheckPort; }

protected:
	string	m_szConfigFile;
	string	m_szProgramName;

	string	m_szErrMessage;

	// log
	string	m_szAppLogRoot;
	int		m_nLogLevel;

	// RCDB
	CDatabaseInfo m_cDatabaseInfo;

	// RCID
	string	m_szRcid;

	// RCTS IP
	string	m_szRctsServer;

	// RCTS IP
	int	m_nAliveCheckPort;
	
	// Internal communication NIC name
	string	m_szInternalNicName;

	// File save directory path
	string m_szFileStorageRoot;

	
private:

};

class CDeamonConfig : public CCommonConfig
{
public:
	static bool Init( string szProgramName, string szFilename );
	static void Exit();
	static CDeamonConfig* GetInstance();

	inline	int				GetHotContentPort()		{ return m_nHotContentPort; }
	inline	int				GetTransferStatPort()	{ return m_nTransferStatPort; }
	inline	int				GetFhsInfoPort()		{ return m_nFhsInfoPort; }
	inline	int				GetMaxFhs()				{ return m_nMaxFhs; }
	inline	int				GetMaxAccount()			{ return m_nMaxAccount; }
	inline	int				GetMaxAnonyMous()		{ return m_nMaxAnonyMous; }
	inline	int				GetIPCQueueCount()		{ return m_nQueueCount; }
	inline	int				GetMaxIPCQueueSize()	{ return m_nMaxIPCQueueSize; }

	// config 파일에 직접 노출 하진 않지만 conf 파일에 설정 가능 하도록 숨김
	unsigned int GetFdCount(){return m_nFdCount; }

	// CHG 2020-07-20 huibong internal cache 관련 fd 감시 on/off 관련 기능 개선 (#33112)
	//                - 변수명 변경에 따라.. 함수명을 IsFdCount -> IsExtractContentFdCount 으로 변경 처리.
	//                - content 에 대한 fd count 정보를 수집할지 여부를 반환
	//                - true 인 경우 fd count 정보 수집.
	bool	IsExtractContentFdCount(){ return m_bExtractContentFdCount; }

	std::string  GetFdCntCMD(){return m_szFdCntCMD; }
	unsigned int GetContentExpireSec(){return m_nContentExpireSec; }
	unsigned int GetContentMaxInfo(){ return m_nContentInofMax; }
private:
	static CDeamonConfig* m_pInstance;

public:
	bool LoadConf();
	bool CheckValue();

	void PrintValue();

protected:
	CDeamonConfig(string szFilename, string szProgramName);
	virtual ~CDeamonConfig();

protected:


private:
	int m_nHotContentPort;
	int m_nTransferStatPort;
	int m_nFhsInfoPort;
	int m_nMaxFhs;
	int m_nMaxAccount;
	int m_nMaxAnonyMous;
	int m_nQueueCount;
	int m_nMaxIPCQueueSize;

	// config 파일에 직접 노출 하진 않지만 conf 파일에 설정 가능 하도록 숨김
	unsigned int m_nContentExpireSec;
	unsigned int m_nContentInofMax;
	unsigned int m_nFdCount;

	// CHG 2020-07-20 huibong internal cache 관련 fd 감시 on/off 관련 기능 개선 (#33112)
	//                - 변수명을 m_isFdCnt -> m_bExtractContentFdCount 으로 변경 처리
	//                - queue pop 처리한 content 에 대해 fd count 정보 추출 여부를 판단하는 변수
	//                - true 인 경우 fd count 정보 수집 처리, default false
	bool m_bExtractContentFdCount;

	// fd count 정보 추출 관련 script 정보
	string m_szFdCntCMD;

};

#endif // __RC_MNGD_CONFIG_H__
