#include	"list.h"

#define		HOUR_NOW		0xFF
#define		HOUR_ALL		0xFE

#define		FORMAT_NONE		(0)
#define		FORMAT_DIA		(1)
#define		FORMAT_NEXT		(2)

class HourInfo ;
class MinInfo ;
class TimeTableInfo ;

/*
 * 内容情報
 */
class DetailInfo : public Link {
private:
	char		m_cMark ;
	LPSTR		m_pText ;

public:
	DetailInfo( char mark ) ;
	~DetailInfo() ;

	BOOL	is_mark( char mark ) const { return m_cMark == mark ; }
	LPCSTR	get_text() const { return m_pText ; }
	void	set( LPCSTR text ) ;

	static void	append( List *pList, char mark, LPCSTR text ) ;
	static DetailInfo	*find( List *pList, char mark ) ;

	void		print() const ;
} ;

/*
 * 時間情報
 */
class HourInfo : public Link {
private:
	TimeTableInfo	*m_pParent ;	/* 時刻表情報へのポインタ */
	List			m_oMin ;
	BYTE			m_bHour ;

public:
	HourInfo( TimeTableInfo *table, BYTE hour ) ;

	int			cmp( BYTE hour ) const ;
	void		append( MinInfo *pMin ) ;
	static HourInfo	*append( List *pList, TimeTableInfo *pTable, BYTE hour ) ;

	List		*get_min() { return &m_oMin ; }
	List		*get_detail() ;
	BYTE		get_hour() const { return m_bHour ; }
	void		pickup( List *pList, DWORD mask, BYTE start_min ) ;

	void		print() ;
} ;

/*
 * 分情報
 */
class MinInfo : public Link {
private:
	HourInfo	*m_pParent ;	/* 時間情報へのポインタ */
	BYTE		m_bMinute ;		/* 分 */
	char		m_cDetail ;		/* 内容 */
	char		m_cExtra ;		/* 追加 */
	DWORD		m_dDayMask ;	/* 日付のマスク */

public:
	MinInfo( HourInfo *parent, BYTE min, DWORD mask ) ;
	MinInfo( MinInfo *base ) ;
	void		set_detail( char mark ) { m_cDetail = mark ; }
	void		set_extra( char mark ) { m_cExtra = mark ; }
	void		set_mask( DWORD mask ) { m_dDayMask = mask ; }
	BYTE		get_min() const { return m_bMinute ; }
	DWORD		get_mask() const { return m_dDayMask ; }
	HourInfo	*get_parent() const { return m_pParent ; }
	BYTE		get_hour() const { return m_pParent->get_hour() ; }

	int			cmp( MinInfo *min ) const ;
	void		make_str_normal( char *buf ) const ;
	void		make_str_on_now( char *ptr, WORD now ) const ;
	void		make_str_on_alarm( char *ptr ) const ;
	void		make_str_for_message( char *ptr ) const ;

	static void	append( List *pList, MinInfo *pMin ) ;

	void		print() const ;
} ;

/*
 * 時刻表情報
 */
class TimeTableInfo {
private:
	CHAR		m_sTitle[ 128 ] ;
	List		m_oHour ;			/* 時間情報 */
	List		m_oDetail ;			/* 内容情報 */
	BYTE		m_bMaxHour ;		/* 最大の時間値 */
	char		m_cMark[ 32 ] ;		/* マーク配列 */
	DWORD		m_dMask[ 32 ] ;		/* 日付マスク配列(NextTrain用) */
	int			m_dNumMask ;		/* 日付マスクの個数(NextTrain用) */
	DWORD		m_dCurMask ;		/* 現在有効な日付マスク(NextTrain用) */
	DWORD		m_dDefMask ;		/* デフォルトの日付マスク(NextTrain用) */
	BYTE		m_bLastHour ;		/* ファイル読み込み中の最終時間 */
	DWORD		m_dFormat ;			/* ファイル読み込み中の形式 */
	char		m_cLast ;			/* ファイル読み込み中の最終記号(DiaTrain用) */
	char		m_cCur ;			/* ファイル読み込み中の現在記号(DiaTrain用) */

public:
	TimeTableInfo() ;
	List		*get_detail() { return &m_oDetail ; }
	DWORD		parse_day_nextfmt( LPSTR ptr ) const ;
	DWORD		except_previous_mask( DWORD event ) const ;
	int			add_mask( char c, DWORD newmask ) ;
	BOOL		check_format( LPSTR line ) ;
	BOOL		read_diatrain( LPSTR line ) ;
	void		adjust_diatrain() ;
	BOOL		read_nextfmt( LPSTR line ) ;
	void		adjust_nextfmt() ;
	BOOL		read( LPCTSTR fn ) ;
	BYTE		get_hour( BYTE hour ) const ;
	BYTE		get_maxhour() const { return m_bMaxHour ; }
	int			pickup( List *list, WORD base, BYTE hour ) ;
	int			delete_until_now( List *list, WORD base ) ;
} ;

/*
 * ファイルリスト情報
 */
class FileTableInfo : public Link {
private:
	TCHAR		m_sPath[ MAX_PATH ] ;
	char		m_sText[ 128 ] ;

public:
	FileTableInfo( LPCTSTR path, LPCSTR text ) ;
	LPCTSTR		get_path() const { return m_sPath ; }
	LPSTR		get_detail() { return m_sText ; }

	static	List	FileList ;
	static	BOOL	read_nextfmt( LPCTSTR fn ) ;
	static	int		list_proc( int index, const BYTE **ptr, int *len ) ;
	static	LPCTSTR	get_path( int index ) ;
	static	LPCSTR	get_detail( int index ) ;
} ;
