#include "RcSyncdRequest.h"
#include "ServiceConfig.h"
#include "Logger.h"
#include "RcSyncdClientSocket.h"	// rc_syncd 와  통신을 처리할 client socket 객체 생성 및 접속
#define RC_SYNCD_HOST       	"127.0.0.1"	                // rc_syncd host

CRcSyncdRequest::CRcSyncdRequest()
{
}

CRcSyncdRequest::~CRcSyncdRequest()
{
}

void CRcSyncdRequest::SendSyncRequest(int nSyncType, const std::string& strStartTime, const std::string& strEndTime)
{
	SendSyncRequest(nSyncType, strStartTime, strEndTime, "");
}

void CRcSyncdRequest::SendSyncRequest(int nSyncType, const std::string& strStartTime, const std::string& strEndTime, const std::string& strService)
{
	bool bResultSuccess = false;	// 처리 결과의 성공/실패 여부를 저장하기 위한 변수.
	std::string strMessage;   		// 수신 메시지 저장 변수.
	int nResult = 0;
	int nTimeout = 5;				// 5sec에 한번씩 Alive Check하기 위함
	
	// 요청 데이타 생성
	CReqMasterData request;
	request.sync_type = (SYNC_TYPE::SYNC_TYPE)nSyncType;
	request.start_time = strStartTime;
	request.end_time = strEndTime;
	request.one_service = strService;
	
	// local rc_syncd와  통신을 처리할 client socket 객체 생성 및 접속
	CRcSyncdClientSocket client;
	if( client.ConnectTarget( RC_SYNCD_HOST, CServiceConfig::GetInstance()->GetOperationPort() ) == false )
	{
		// local rc_syncd 으로 접속 실패시
		_LOG( LERR, "rc_syncd connect fail. [%s][%d]", RC_SYNCD_HOST, CServiceConfig::GetInstance()->GetOperationPort());
		return ;
	}
	
	// rc_syncd로 sync 요청 전달
	if( client.SendSyncRequest( request ) == false )
	{
		// 전송 실패시
		_LOG( LERR, "Sync request send fail");
		return ;
	}
	
	// 루프를 돌면서 요청에 대한 응답을 대기
	while(1)
	{
		// nTimeout 에 지정된 시간동안 응답대기	
		nResult = client.GetSyncResult( nTimeout, bResultSuccess, strMessage);
        
		if( nResult == -1 )
		{
			// Socket 통신 관련 오류 또는 접속 종료가 발생한 경우.
			// 해당 내역 로깅 및 루프 종료
			_LOG( LERR, "Response wait fail by socket" );
			break;
		
		}
		else if( nResult == 0 )
		{
			// 지정된 시간 동안 응답대기 중 처리 결과 정보가 아직 수신되지 않은 경우 => Alive Check 패킷 한번 쏘고 다시 Loop 로
			
			if( client.SendAliveCheck() == false )
			{
				// Alive 전송 실패시 => Socket 종료 및 오류가 발생한 경우임.
				_LOG( LERR, "Response wait fail by socket2");
				break;
			}
			LOG( LDBG, "Response wait");			
			// 정상적인 경우 다시 응답대기.
			continue;
		}
		else if( nResult == 1 )
		{
			// 요청에 대한 처리결과 정보가 수신된 경우.
			// 해당 정보 로깅처리.
			
			if( bResultSuccess == true )
			{
				// 요청에 대한 처리가 정상적으로 처리된 경우				
				_LOG( LINF, "Sync result SUCCESS [%s]", strMessage.c_str() );
			
			}
			else
			{
				// 오류 발생시 
				_LOG( LINF, "Sync result ERROR [%s]", strMessage.c_str() );
			
			}			
			
			break;	// 응답을 받았으니 응답 대기 루프 종료
		}
		else
		{
			// Replication 요청에 대한 응답패킷이 아닌 경우.
			// 해당 패킷은 무시하고 다시 Loop 로 
			continue;
		}
	}
	
	sleep(1);
	
	client.Close();
}
