/****************************************************************************
				rc_balanced target content select thread header 
				-----------------------------------------

	begin      : 2019/03/14
	copyright  : (C) 2005 Solbox Inc.
	author     : huibong
	email      : huibong@solbox.com
	version    : 3.5

	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 __TARGET_SELECT_THREAD_H__
#define __TARGET_SELECT_THREAD_H__

#include <pthread.h>

#include "RebalanceData.h"
#include "DataQueue.hpp"
#include "RcdbInfo.h"
#include "Database.h"
#include "ShmInfoThread.h"

#include <string>
#include <list>


// 한번 선정되어 rebalance 처리한 FHS 정보 저장을 위한 객체
class CCompleteFhsInfo
{
	public:

		// 마지막 선택된 시간
		time_t m_timeSelect;

		// 장비 name
		std::string m_szHostName;
		
		// 생성자 (마지막 선택 시간은 현재 시간으로 설정 처리)
		inline CCompleteFhsInfo() { time( &m_timeSelect ); }
};


// CTargetSelectThread class
// - rebalance 처리 대상 FHS 선정 및 Content 선정 처리를 수행
// - move 처리할 content 정보를 move standby queue 에 저장 처리
// - 한번 선정된 FHS 는 특정 시간동안 재선정 되지 않는다.
class CTargetSelectThread
{
	public:

		// 생성자
		CTargetSelectThread( CDataQueue<CRebalanceData> * const pQueueMoveStandby
							, CShmInfoThread * const pShmInfoThread );

		// 소멸자
		~CTargetSelectThread();

		// Thread 를 생성하여 주기적으로 job 을 처리한다.
		bool Start( void );


	private:

		// Thread handle
		pthread_t m_threadHandle;

		// Thread Loop 마다 Sleep Time 정보를 저장하기 위한 변수
		unsigned int m_uSleep;

		// Move 처리 대상 content 정보를 저장하는 queueMoveStandby 객체에 대한 포인터
		CDataQueue<CRebalanceData> * m_pQueueMoveStandby;

		// Sharde memory 정보를 추출하여 관리하는 Thread 객체에 대한 포인터
		CShmInfoThread * m_pShmInfoThread;

		// 선택되어 MOVE 처리한 FHS 는 특정시간동안 다시 선택되지 않도록 목록으로 관리
		std::list<CCompleteFhsInfo> m_listCompleteFhs;

		// RCDB 연결 정보 관리 객체
		CRcdbInfo m_rcdbInfo;

		// 선택되어 MOVE 처리한 FHS 의 특정시간 동안 재선택을 방지하기 위한 Timeout 값
		// 단위: sec
		// - conf 설정 등을 참고로 초기화시 자동으로 계산됨.
		unsigned int m_uTimeoutFhsReselection;

		// Rebalance 대상 장비로 선택된 FHS 에서 한번 선택시 전송 처리할 Content 의 최대 크기
		unsigned long long  m_uMaxTransferlimit;



	private:

		// Thread loop base function
		static void * threadFunc( void * arg );

		// 실제 Content Copy 처리를 control 하는 함수
		void Execute( void );

		// FHS 의 재선택 방지 관련 timeout 및 최대 전송 가능 제한값을 계산한다.
		bool CalcInternalLimit( void );

		// m_queueCompleteFhs 에서 expire 시간이 지난 FHS 정보 삭제 처리. 
		void UpdateCompleteFhs( void );

		// m_queueCompleteFhs 에 FHS 정보 등록
		void InsertCompleteFhs( std::string & szHost );


		// RCDB 에서 Move 처리할 대상 서비스를 선택한다.
		bool SelectService( DataBase &rcdb, std::string & szService );

		// RCDB 에서 Move 처리할 Content 를 조회하여.. queue 에 push 처리한다.
		bool SelectContent( DataBase &rcdb, std::string & szRebalanceHost, std::string & szService );

		

};

#endif /* __TARGET_SELECT_THREAD_H__ */

