%%%-------------------------------------------------------------------
%%% @author liushl
%%% @doc
%%%
%%% @end
%%%-------------------------------------------------------------------
-author("liushl").

%%%-------------------------------------------------------------------
%%% @doc
%%%     常量定义
%%% @end
%%%-------------------------------------------------------------------
%% 比赛阶段
-define(BC_STAGE_IDLE,    0).     %% 未开始
-define(BC_STAGE_SIGN,    1).     %% 报名阶段
-define(BC_STAGE_PRE,     2).     %% 预赛海选
-define(BC_STAGE_TOP_16,  3).     %% 16进8
-define(BC_STAGE_TOP_8,   4).     %% 8进4
-define(BC_STAGE_TOP_4,   5).     %% 4进2
-define(BC_STAGE_TOP_2,   6).     %% 决赛
-define(BC_STAGE_CHAMPION,7).     %% 冠军专用

-define(BC_MASK,    1).

%% 每天活动开始时间
-define(BC_BEGIN_TIME, {0, 0, 0}).
%% 总决赛活动结束时间
-define(BC_END_TIME,   {23, 55, 0}).

%% 游戏服大于该轮次时，进入跨服模式
-define(BC_LOCAL_PATTERN_ROUND, 1).

%% 阶段持续时间：天
-define(BC_STAGE_DAY(Stage),
    case Stage of
        ?BC_STAGE_SIGN   -> 1;
        ?BC_STAGE_PRE    -> 2;
        ?BC_STAGE_TOP_16 -> 1;
        ?BC_STAGE_TOP_8  -> 1;
        ?BC_STAGE_TOP_4  -> 1;
        ?BC_STAGE_TOP_2  -> 1
    end).
%% 根据星期获得活动阶段和阶段开启星期
-define(BC_STAGE_BY_WEEK(Week),
    case Week of
        1  -> {?BC_STAGE_SIGN, 1};
        2  -> {?BC_STAGE_PRE, 2};
        3  -> {?BC_STAGE_PRE, 2};
        4  -> {?BC_STAGE_TOP_16, 4};
        5  -> {?BC_STAGE_TOP_8, 5};
        6  -> {?BC_STAGE_TOP_4, 6};
        7  -> {?BC_STAGE_TOP_2, 7}
    end).

%% 阶段选取人数
-define(BC_STAGE_ROLES(Stage),
    case Stage of
        ?BC_STAGE_SIGN  -> data_beauty_contest:get_beauty_contest_kv(act_role_number);
        ?BC_STAGE_PRE    -> 16;
        ?BC_STAGE_TOP_16 -> 8;
        ?BC_STAGE_TOP_8  -> 4;
        ?BC_STAGE_TOP_4  -> 2;
        ?BC_STAGE_TOP_2  -> 1
    end).

%% 参赛数据
%% 用四个参数表示一条参赛数据
%%// {衣服时装，0, 时装id，颜色}
%%// {头饰， 0, 时装id，颜色}
%%// 武器/坐骑/翅膀/宝具：
%%// {珍宝，1，珍宝外观id，星级}
%%// {进阶，2，阶数，0}
%%// {时装，3，时装id，颜色}
%%type:int8        // 类型1-6
%%value1:int8      // 类型1-2(0)|类型3-6(幻化类型：1珍宝2进阶阶数3时装)
%%value2:int32     // 类型1-2(时装id)|类型3-6(幻化类型1：珍宝外观id/幻化类型2：进阶阶数/幻化类型3：时装id)
%%value3:int8      // 类型1-2(时装颜色id)|类型3-6(幻化类型1：珍宝星级/幻化类型2：0/幻化类型3：时装颜色id)
%%}
-define(BC_DATA_CLOTH,   1).  %% 衣服时装
-define(BC_DATA_HEAD,    2).  %% 头饰
-define(BC_DATA_WEAPON,  3).  %% 武器
-define(BC_DATA_HORSE,   4).  %% 坐骑
-define(BC_DATA_WING,    5).  %% 翅膀
-define(BC_DATA_PEARL,   6).  %% 宝具
-define(BC_DATA_HAIR,    7).  %% 发型

-define(BC_FOSTER_SKIN,    1).  %% 珍宝皮肤
-define(BC_FOSTER_STAGE,   2).  %% 进阶外观
-define(BC_FOSTER_FASHION, 3).  %% 时装
%% 计数器
-define(BC_COUNTER_DAILY_VOTE, 1).
%%%-------------------------------------------------------------------
%%% @doc
%%%     数据结构
%%% @end
%%%-------------------------------------------------------------------
%% 参赛人员
-record(beauty_contest_role, {
    role_id         = 0
    , zone_id       = 0
    , server_id     = 0
    , server_num    = 0
    , picture       = undefined
    , fashion_num   = 0         %% 时装数量
    
    , contest_data  = []        %% 竞赛数据
    , vote          = 0         %% 票数
    , pick_counts   = 0         %% 挑选次数
    , time          = 0         %% 投票时间
    , update        = true      %% 更新标识：投票/个人信息变更/阶段结算/合服合区
    %% 最后阶段, 默认进入了海选
    , stage         = ?BC_STAGE_PRE
    , origin_rank   = 0         %% 初始排名(海选赛进16强的初始排名，赛程期间不变)
    , rank          = 0         %% 最终排名
}).

%% 报名人员
-record(beauty_contest_sign, {
    role_id = 0
    , contest_data  = []        %% 竞赛数据
    , sign_award    = 0         %% 是否报名领奖
}).

%% 玩家数据
-record(role_beauty_contest, {
    vote_log = []       %% 投票日志：[{name, time}]
}).

-record(beauty_contest, {
    cls_type        = 0
    , act_data      = #{}           %% 活动数据
    
    , begin_time    = 0             %% 活动开始时间
    , end_time      = 0             %% 活动结束时间
    , stage         = 0             %% 活动阶段
    , stage_begin   = 0             %% 阶段开始时间
    , stage_end     = 0             %% 阶段结束时间
    
    , ref_stage     = undefined     %% 阶段切换定时器-结算当前阶段/进入下一阶段
    , ref_save      = undefined     %% 定时保存玩家数据
    
    , round         = 0             %% 本服有效：轮次，每次开启+1,第一轮为本服模式
    , sign_roles    = #{}           %% 本服有效：所有报名的玩家。比赛阶段，默认每个玩家都报名了
    , vote_candidates = #{}         %% 本服有效：玩家的投票候选：[{RoleId, [A,B]}]
                                    %% 玩家每次请求投票候选后，记录下来，直到玩家投票才进行更新
    , act_log       = []            %% 本服有效：上期数据，每个服务器都记录一份数据
}).

-record(beauty_contest_act, {
    zone_id       = 0
    , members     = []          %% 全部玩家
}).
%%%-------------------------------------------------------------------
%%% @doc
%%%     DB
%%% @end
%%%-------------------------------------------------------------------
%% 加载参赛人员-跨服
-define(SQL_BC_LOAD_ACT_ROLE,
    <<"SELECT `role_id`,`zone_id`,`server_id`,`server_num`,`name`,`lv`,`sex`,`vip`,`sup_vip`,`career`,`turn`,`picture`,`picture_dress`,`contest_data`,`vote`,`pick_counts`,`time`,`stage`,`rank`,`origin_rank`,`fashion_num` FROM beauty_contest_role">>).
%% 保存参赛人员-批量-跨服
-define(SQL_BC_SAVE_ACT_ROLE_BATCH,
    <<"REPLACE INTO beauty_contest_role(`role_id`,`zone_id`,`server_id`,`server_num`,`name`,`lv`,`sex`,`vip`,`sup_vip`,`career`,`turn`,`picture`,`picture_dress`,`contest_data`,`vote`,`pick_counts`,`time`,`stage`,`rank`,`origin_rank`,`fashion_num`) VALUES ~ts">>).
%% 清除参赛人员-跨服
-define(SQL_BC_DELETE_ACT_ROLE,
    <<"DELETE FROM beauty_contest_role WHERE zone_id in (~ts)">>).
%% 清空参赛人员-跨服
-define(SQL_BC_CLEAN_ACT_ROLE,
    <<"TRUNCATE beauty_contest_role">>).

%% 加载参赛人员-本服
-define(SQL_BC_LOAD_ACT_ROLE_LOCAL,
    <<"SELECT `role_id`,`contest_data`,`vote`,`pick_counts`,`time`,`stage`,`rank`,`origin_rank` FROM beauty_contest_role_local">>).
%% 保存参赛人员-批量-本服
-define(SQL_BC_SAVE_ACT_ROLE_BATCH_LOCAL,
    <<"REPLACE INTO beauty_contest_role_local(`role_id`,`contest_data`,`vote`,`pick_counts`,`time`,`stage`,`rank`,`origin_rank`) VALUES ~ts">>).
%% 清空参赛人员-本服
-define(SQL_BC_CLEAN_ACT_ROLE_LOCAL,
    <<"TRUNCATE beauty_contest_role_local">>).

%% 加载报名数据
-define(SQL_BC_LOAD_SIGN,
    <<"SELECT role_id,contest_data,sign_award FROM beauty_contest_sign">>).
%% 保存报名数据
-define(SQL_BC_SAVE_SIGN_ONE,
    <<"REPLACE INTO beauty_contest_sign(role_id,contest_data,sign_award) VALUES(~p,'~ts',~p)">>).
%% 清空报名数据
-define(SQL_BC_CLEAN_SIGN, <<"TRUNCATE beauty_contest_sign">>).

%% 加载投票记录
-define(SQL_BC_LOAD_VOTE_LOG,
    <<"SELECT vote_name,time FROM beauty_contest_vote_log WHERE role_id=~p ORDER BY time DESC LIMIT 20">>).
%% 保存一条投票记录
-define(SQL_BC_SAVE_VOTE_LOG,
    <<"INSERT INTO beauty_contest_vote_log(role_id,vote_name,time) VALUES(~p,'~ts',~p)">>).
%% 清空投票记录
-define(SQL_BC_CLEAN_VOTE_LOG,
    <<"TRUNCATE beauty_contest_vote_log">>).

%% 加载上期日志
-define(SQL_BC_LOAD_ACT_LOG,
    <<"SELECT `rank`,`server_num`,`name`,`lv`,`sex`,`vip`,`sup_vip`,`career`,`turn`,`picture`,`picture_dress`,`contest_data`,`origin_rank`,`stage` FROM beauty_contest_log">>).
%% 清空上期日志
-define(SQL_BC_CLEAN_ACT_LOG, <<"TRUNCATE beauty_contest_log">>).
%% 保存上期日志
-define(SQL_BC_SAVE_ACT_LOG, <<"INSERT INTO beauty_contest_log(`rank`,`server_num`,`name`,`lv`,`sex`,`vip`,`sup_vip`,`career`,`turn`,`picture`,`picture_dress`,`contest_data`,`origin_rank`,`stage`) VALUES ~ts">>).

%%%-------------------------------------------------------------------
%%% @doc
%%%     玩法配置
%%% @end
%%%-------------------------------------------------------------------
%% 服务器基础开服天数:功能模块开放配置
-define(BC_OPEN_TIME,           lib_module:get_open_day(416)).
%% 投票区人数
-define(BC_RANK_LENGTH,         data_beauty_contest:get_beauty_contest_kv(act_role_number)).
%% 系统投票随机最大数
-define(BC_SYS_VOTE_NUM,   5).

-ifdef(DEV_SERVER).
%% 系统投票间隔时间
-define(BC_SYS_VOTE_TIME,  60).
%% 保存玩家数据时间间隔
-define(BC_SAVE_TIME,   60).
-else.
-define(BC_SYS_VOTE_TIME,  3600).
-define(BC_SAVE_TIME,   3600).
-endif.

%% 报名奖励
-define(BC_SIGN_AWARD,          data_beauty_contest:get_beauty_contest_kv(signup_reward)).
%% 投票普通奖励
-define(BC_VOTE_NORMAL_AWARD,   data_beauty_contest:get_beauty_contest_kv(vote_reward)).
%% 投票额外奖励
-define(BC_VOTE_EXTRA_AWARD,    data_beauty_contest:get_beauty_contest_kv(sp_vote_reward)).

%% 可投票次数
-define(BC_VOTE_COUNTS(Stage),
    case Stage of
        ?BC_STAGE_PRE    -> data_beauty_contest:get_beauty_contest_kv(daily_vote);
        ?BC_STAGE_TOP_16 -> data_beauty_contest:get_beauty_contest_kv(daily_vote);
        ?BC_STAGE_TOP_8  -> data_beauty_contest:get_beauty_contest_kv(daily_vote);
        ?BC_STAGE_TOP_4  -> data_beauty_contest:get_beauty_contest_kv(four_vote);
        ?BC_STAGE_TOP_2  -> data_beauty_contest:get_beauty_contest_kv(finals_vote);
        _ -> 0
    end).