#include "ModeSync.h"
#include "ExecCall.h"
#include "Logger.h"

// class CSyncMode : Sync Mode class
CSyncMode::CSyncMode(CProcessSocketControl * pclient)
	: CServiceMode(pclient)
{
}

CSyncMode::~CSyncMode()
{
	// rc_cmove 해당 파일 사용하기 때문에 정상적으로 처리되었으면 삭제되면 안됨
	//if (!IsEmpytSycnList())
	//{
	//	m_synclist.GetFirst().UnlinkFile();
	//}
}

bool CSyncMode::CreateSyncList(CReqSyncData &d)
{
	return m_synclist.CreateList(d);
}

void CSyncMode::Execute()
{
	// Socket 을 통해 Master 로부터 sync 수행을 위한 파일을 수신 처리한다.
	std::string strMessage;
	if( m_pclient->RecvFileExecuteSyncFromMaster( m_synclist.GetFirst().file_sync_name, strMessage ) == false )
	{
		// sync 파일 수신 실패시...
		// - 여러 가지 상황이 발생 가능하므로...
		// - 에러 로깅 후 세션을 종료 처리한다. ( 그래야.. client 에서 재시도하므로.. )
		LOG( LERR, "Sync request file[%s] receive failed [%s]. session close."
			 , m_synclist.GetFirst().file_sync_name.c_str()
			 , strMessage.c_str() );

		m_pclient->Close();

		return;
	}

	// Client 가 응답대기 중이므로.. rc_cmove 를 실제 수행시키기 전에 응답을 해줘야 한다.
	if (IsEmpytSycnList())
	{
		strMessage = "Empty Sync Mode Sync Data.";

		// 오류 결과 전송
		m_pclient->SendResultExecuteSyncToMaster( false, strMessage );
		m_synclist.GetFirst().UnlinkFile();
		LOG( LERR, "%s", strMessage.c_str() );
		return;
	}

	// 실제 rc_move 실행전에 Master 에게 정상 처리관련 응답 전송.
	// - 응답 전송 실패시.. Master 가 재시도를 하므로... 작업을 진행하지 말것.
	strMessage = "Sync job start.";
	if( m_pclient->SendResultExecuteSyncToMaster( true, strMessage ) == false )
	{
		LOG( LERR, "Send reponse (job start) fail to Master. job cancel." );
		m_synclist.GetFirst().UnlinkFile();
		return;
	}
	
	// 받은 sync file을 인자로 rc_move 수행
	CExecCall rcmove(m_synclist.GetFirst());
	/// 명령 수행함 시킴
	if (rcmove.Call(CExecCall::RC_CMOVE, false) != 0)
	{
		LOG(LERR, "Failed rc_cmove call");
		return;
	}

	return;
}
