%%%----------------------------------------------------------------------
%%%
%%% wg @copyright 2009
%%%
%%% @author litao cheng <litaocheng@gmail.com>
%%% @doc the crontab record defines
%%%
%%%----------------------------------------------------------------------

-define(CRON_ANY, 1). % "*"
-define(CRON_NUM, 2). % 2
-define(CRON_RANGE, 4). % 2-3
-define(CRON_LIST, 8). % "2,3-6"
-type cronf_type() :: 1 | 2 | 4 | 8.

-type cronf_num() :: non_neg_integer().
-type cronf_range() :: {non_neg_integer(), non_neg_integer(), pos_integer()}.
-type cronf_list() :: [cronf_num() | cronf_range()].

-type cronf_value() :: cronf_num() | cronf_range() | cronf_list().

-record(cron_field, {
    type = ?CRON_ANY :: cronf_type(),   % field type
    value :: cronf_value()              % field value
}).
-type cron_field() :: #cron_field{}.

-record(cron_entry, {
    m :: cron_field(),       % minute
    h :: cron_field(),       % hour
    dom :: cron_field(),     % day of month
    mon :: cron_field(),     % month
    dow :: cron_field(),     % day of week
    mfa :: tuple()           % the mfa
}).
-type cron_entry() :: #cron_entry{}.

-define(CRON_FILE, "../ebin/data_crontab.beam").
-define(CRON_FILE_CLS, "../ebin/data_crontab_cls.beam").

-define(RELOAD_FILE_INTERVAL, 60000 * 60). % 1 hour
-define(CHECK_FILE_INTERVAL, 60000). % 1 min
-define(CHECK_CRON_INTERVAL, 60000). % 1 min
-define(SERVER, ?MODULE).

-record(crontab_state, {
    files =[],                      % file name
    file_activity :: list(),        % activity file lists
    mtime = 0 :: pos_integer(),     % last modify time
    entrys = [] :: [cron_entry()],  % the cron tasks
    file_timer :: reference(),      % the check file last modified timer
    cron_timer :: reference()       % the check cron task timer
}).