/***************************************************************************
                Log File Process Base Trhead
                -----------------------------------------
    begin      : 2015/10/07
    copyright  : (C) 2010 SolutionBox Inc.
    author     : Service 1 Team
    email      : svc1@solbox.com
    version    : 1.0

    CopyRight(C) 2010 SolutionBox Inc. All Rights reserved.
    Redistribution and use in source and binary forms, with or with out
    modification, are not permitted in outside of SolutionBox Inc.
***************************************************************************/

#ifndef __CASH_GENERATOR_H__
#define __CASH_GENERATOR_H__

#include <pthread.h>
#include <string>
#include <stdint.h>
#include "Logger.h"
#include "Signal_handle.h"

using namespace std;

/// @brief
class CLogFileProcessThread
{
public:
	/// @brief 생성자
	CLogFileProcessThread(string myname);
	~CLogFileProcessThread();
	
	/// @brief Thread를 생성하고, 이를 시작한다.
	/// @param none
	/// @return 성공은 return true 실패는 return false
	bool Start();
	
	/// @brief ProcessStatus 내의 RCDB 관련 설정값을 이용해 DB Connection을 한다.
	/// @param sighandle 쓰레드에서 signal에 따라 정상 종료하도록 signal handle을 전달한다.
	/// @param pshmemNetworStat 공유메모리 포인터
	/// @return 성공하면 return true 실패하면 return false
	bool ThreadInit(const sig_atomic_t *sighandle);

	

// Attributes
private:
	// 쓰레드 핸들
	pthread_t m_threadHandle;
	
	const sig_atomic_t *m_sighandle;

	///@brief 작업 시간 구간을 저장하는 구조체.
	typedef struct LOG_FILE_PROCESS_TIME_SCOPE
	{
		int begin;
		int end;
	} LogFileProcessTimeScope;

	///@brief 상태값.
	typedef enum LOG_FILE_PROCESS_STATUS
	{
		LFP_READY = 0,
		LFP_SLEEP,
		LFP_WORKING,
		LFP_DONE
	} LogFileProcessStatus;

	///@brief 오늘 날자를 저장. struct tm 구조체의 tm_mday 값.(1~31)
	int m_nToday;

	///@brief 현재 상태를 저장.
	LogFileProcessStatus m_nStatus;

	///@brief 작업 시간 구간을 저장.
	LogFileProcessTimeScope m_TimeScope;

	bool bFirst;

	string m_szMyName;

// Operations
private:
	///@brief 상태를 설정하는 함수.
	///@param status [in] 설정할 상태값.
	///@return none.
	void SetStatus( LogFileProcessStatus status );

	///@brief 현재 상태를 얻는 함수.
	///@param none.
	///@return 현재 상태를 반환.
	LogFileProcessStatus GetStatus() { return m_nStatus; };

	///@brief 정수형의 상태를 입력 받아서 문자열로 반환하는 함수.
	///@param status [in] 상태값.
	///@return status에 해당하는 문자열을 반환.
	///        "LFP_READY", "LFP_SLEEP", "LFP_WORKING", "LFP_DONE" , "UNKOWN" 중 하나.
	std::string GetStrStatus( LogFileProcessStatus status );

	///@brief 작업 시작 여부를 판단하는 함수.
	///@param now [in] 현재 시각을 저장하고 있는 tm 구조체.
	///@return 현재 상태에 따라 아래의 값을 반환.
	///       - LFP_READY   : 현재 시각이 작업 시간 구간에 있는지 확인해서 작업 시간 구간이면 true, 그렇지 않으면 false 반환.
	///       - LFP_DONE    : false 반환 
	///       - LFP_SLEEP   : false 반환 
	///       - LFP_WORKING : false 반환 
	bool IsBeginWork( struct tm& now );

	///@brief 주어진 시간이 작업 시간 구간인지 판단하는 함수.
	///@param hour [in] 시간값 (0~23)
	///@return 4 <= hour < 7이면 true, 그렇지 않으면 false 반환.
	bool IsInWorkTimeScope( int hour );

	///@brief 날자가 변경 되었는지를 확인하는 함수.
	///@param day [in] 날자값 (1~31)
	///@return 주어진 day가 m_nToday와 같으면 false, 다르면 true 반환.
	bool IsChangedDay( int day );

	///@brief 작업 시간 구간 내에서 실제로 작업을 시작할 때까지 대기할 수 있는 최대 시간을 초 단위로 계산하는 함수.
	///@param now [in] 현재 시각을 저장하고 있는 tm 구조체.
	///@return 주어진 시간에서 작업 시간 구간의 마지막 시간까지의 남은 초를 반환.
	///        주어진 시간이 작업 구간 내에 있지 않거나 시간 정보가 올바르지 않으면 -1 반환.
	int GetMaxSleepSecond( struct tm& now );

	///@brief 오늘 날자를 구하는 함수
	///@param none.
	///@return 오늘 날자를 반환한다.(1~31)
	int GetToday();

	int Rand( uint32_t max, uint32_t key );
// Functions
private:
	// 쓰레드 시작 루틴이다.
	static void* EntryPoint(void* arg);
	
	// 해당 함수의 내용은 수정하지 말것.
	void Execute();

protected:
	///@brief 실제 로그 파일을 처리하는 함수.
	///@      가상 함수로 CLogFileProcessThread 클래스를 상속받는 자식 클래스에서 구현해야 한다.
	virtual bool DoWork() { return false; };

	///@brief 주어진 경로가 디렉토리인지 아닌지를 판단하는 함수.
	///@param path [in] 경로.
	///@return path가 존재하지 않거나 파일이면 false, 그렇지 않으면 true 반환.
	bool IsDirectory( std::string path );

	///@brief 파일을 unlink 시키는 함수.
	///@param filename [in] 삭제할 파일명
	///@return unlink 성공하면 true, 그렇지 않으면 false 반환.
	bool Unlink( std::string filename );

};
#endif //__CASH_GENERATOR_H__
