%%% -------------------------------------------------------
%%% @author huangyongxing@yeah.net
%%% @doc
%%% 跨服分区基础相关定义
%%% @end
%%% -------------------------------------------------------
-ifndef(CZONE_HRL).
-define(CZONE_HRL, ok).

%% 分区资料表
-define(SQL_SELECT_CZONES, <<"SELECT `zone_id`,`stage`,`server_ids`,`faction_names` FROM `center_zones`">>).
-define(SQL_REPLACE_CZONE_PREFIX, <<"REPLACE INTO `center_zones` (`zone_id`,`stage`,`server_ids`,`faction_names`)">>).
-define(SQL_DEL_CZONE, <<"DELETE FROM `center_zones` WHERE `zone_id`=~w">>).

%% 分区中游戏服基础资料表
-define(SQL_SELECT_ZONE_SVR_BASE, <<"SELECT `server_id`,`faction`,`world_level` FROM `center_zone_svr_base`">>).
-define(SQL_REPLACE_ZONE_SVR_BASE, <<"REPLACE INTO `center_zone_svr_base` (`server_id`,`faction`,`world_level`)">>).

%% 合并子分区相关资料表 center_rezone_info
-define(SQL_SELECT_REZONE_INFO, <<"SELECT `zone_id`,`zone_id_2`,`next_stage`,`svr_factions`,`scheduled_time`,`confirm` FROM `center_rezone_info`">>).
-define(SQL_REPLACE_REZONE_INFO_PREFIX, <<"REPLACE INTO `center_rezone_info` (`zone_id`,`zone_id_2`,`next_stage`,`svr_factions`,`scheduled_time`,`confirm`)">>).
-define(SQL_DEL_REZONE_INFO, <<"DELETE FROM `center_rezone_info` WHERE zone_id=~w">>).

%% 时间节点
%% 预分区时间
-define(PRE_TIME, {9, 0, 0}).
%% 确认时间（将预分区结果移动到已确认数据区）
-define(CONFIRM_TIME, {12, 0, 0}).
%% 执行合并的时间（按已确认数据执行分区，并清理数据）
-define(REZONE_TIME, {9, 0, 0}).
%% 预告定时器（按已确认数据进行预告）
-define(NOTICE_TIME, {8, 50, 0}).

%% 阵营
-define(FACTION_1,      1).
-define(FACTION_2,      2).
-define(FACTION_3,      3).
-define(FACTION_4,      4).
%% 阵营列表
-define(FACTION_LIST, [?FACTION_1, ?FACTION_2, ?FACTION_3, ?FACTION_4]).

%% 当配置缺失时，默认的世界等级需求
-define(DEFAULT_WORLD_LV_REQT, 999).

%% 计数器type值
-define(CZONE_COUNTER_STAGE_AWARD_STATE, 1).        % 分区阶段备战奖励状态

%% 游戏服缓存的分区基本数据
-record(czone_svr_local, {
        zone_id = 0                 % 分区id
        ,stage = 0                  % 分区阶段
        ,faction = 0                % 分区中的阵营
    }).

%% ** 各模块需要存储在分区管理进程中的自定义数据的集合结构 **
%% 需要添加和管理的数据，都添加在这里（或自己在进程字典中管理）
%%
%% 数据从db中load到内存、数据更新维护、数据存储等
%% 均由相关功能模块在回调中自行实现
%% 存储到 #zone_proc_state.module_state 中
-record(cz_state, {
    }).

%% 分区管理相关数据
-record(czone_sys, {
        pre_rezone_data = []        % 预重新分区结果（定时器生成或人工编辑生成） [ #rezone_info{} ]
        ,confirm_rezone_data = []   % 已确认分区数据（正式分区前） [ #rezone_info{} ]
        ,pre_timer = undefined      % 预重新分区定时器（每天触发，统一检查是否满足条件）
        ,confirm_timer = undefined  % 分区正式确定定时器（确定后不可修改）
        ,notice_timer = undefined   % 正式执行分区之前预告定时器
        ,rezone_timer = undefined   % 正式执行分区定时器
        ,notice_state = false       % 用于标记是否处于notice与rezone之间（通知倒计时阶段）
        %% 阵营相关资料，主要供给其他功能使用，对分区逻辑本身无意义（额外的更新管理成本）
        ,svr_faction_map = #{}      % 游戏服阵营资料 #{ServerId => Faction}
        ,zone_faction_svrs_map = #{}% 分区阵营对应游戏服列表 #{ZoneId => FSvrsMap}, FSvrsMap :: #{Faction => ServerIds}
    }).

%% 系统 - 单个分区数据（多个游戏服）
%% 存储于#zone_info.ext，维护czone类型分区的分区核心数据
-record(czone_info, {
        stage = 0                   % 当前分区阶段
        ,world_lv_avg = 0           % 平均世界等级
        ,faction_names = []         % 阵营名称列表（为空时即默认名，[{1, "阵营1"}, ...]）
    }).

%% 系统 - 单个游戏服数据
%% 存储于#zone_svr.ext，维护czone类型分区中单服的分区核心数据
-record(czone_svr, {
        faction = 1                 % 阵营/派系
        ,world_level = 0            % 世界等级
    }).

%% 系统 - 单个合并信息
-record(rezone_info, {
        zone_id = 0                 % 主分区id
        ,zone_id_2 = 0              % 副分区id
        ,next_stage = 0             % 下一分区阶段
        ,svr_factions = []          % 合区重新分配的各服阵营信息 [{ServerId, Faction}, ...]
        ,scheduled_time = 0         % 计划正式分区时间（0表示运营在未满足条件前提前修改的数据，非0应当进行合并管理）
    }).

-endif.
