<?php

namespace loyalsoft;

//
///**
// * 统计模块
// * 统计:反应的是一段时间内的趋势. 所以,所有数据都要依据时间进行分类. 其他的统计维度另算. -王刚
// * @version
// *          1.0.0 Created at 2016-5-24. by --gwang
// * @author gwang (mail@wanggangzero.cn)
// * @copyright © 2016-5-24, SJZ LoyalSoft Corporation & gwang. All rights reserved.
// */
//class StatProc {
//
//    public static function test($req) {
//        CLog::info("异步测试成功!", "Statproc::Test");
//        DebugHelper::var_dump("异步调用");
//        return $req;
//    }
//
//    const maxLevel = 100;
//    const maxDays = 30;
//
//    /**
//     * 玩家登录
//     * @param type $level
//     */
//    public static function UserLogin($req, $isNew = 0) {
//        $redis = gMem();
//        $redis->hincrby(MemKey_Stat::UserLevel_hash(), $level);
//    }
//
//    /**
//     *  设置新手引导步骤
//     * @param int $tsBirth 玩家创建角色的时刻
//     * @param int $zoneid
//     * @param int $tarStep
//     * @param int $currentStep
//     */
//    public static function UserGuidStep($tsBirth, $zoneid, $tarStep, $currentStep) {
//        if ($tarStep == $currentStep) {
//            return;
//        }
//        $redis = gMem();
//
//        if ($tarStep == 0) {                                                    #  跳过新手引导
//            $redis->hincrby(MemKey_Stat::UserGuidSkip_Day($tsBirth, $zoneid), $currentStep);
//            $redis->hincrby(MemKey_Stat::UserGuidSkip_Week($tsBirth, $zoneid), $currentStep);
//            $redis->hincrby(MemKey_Stat::UserGuidSkip_Month($tsBirth, $zoneid), $currentStep);
//        } else {
//            $redis->hincrby(MemKey_Stat::UserGuidLose_Day($tsBirth, $zoneid), $tarStep);
//            $redis->hincrby(MemKey_Stat::UserGuidLose_Week($tsBirth, $zoneid), $tarStep);
//            $redis->hincrby(MemKey_Stat::UserGuidLose_Month($tsBirth, $zoneid), $tarStep);
//        }
//    }
//
//    /**
//     * 任务步骤
//     * @param int $tsBirth
//     * @param int $level
//     * @param int $completeStep
//     */
//    public static function TaskStep($tsBirth, $level, $completeStep) {
//        $redis = gMem();
//        $redis->zincrby(MemKey_Stat::TaskStep_zset(), $completeStep);
//        $redis->zincrby(MemKey_Stat::TaskStep_Day_zset($tsBirth), $completeStep);
//        $redis->zincrby(MemKey_Stat::TaskStep_level_zset($level), $completeStep);
//    }
//
//    /**
//     * 首次充值
//     * @param string $uid 玩家ID
//     * @param int $tsBirth
//     * @param int $level
//     * @param int $amt 充值金额单位0.1元
//     */
//    public static function Pay($uid, $tsBirth, $level, $amt) {
//        if ($amt <= 0) {
//            return;
//        }
//        $redis = gMem();
//        $day = CommUtil::tsDay() - CommUtil::tsDay($tsBirth);
//        $day = $day > self::maxDays ? self::maxDays : $day;                     # 超过30天的合并到30天
//        if ($redis->sismember(MemKey_Stat::PayedUsers(), $uid)) {
////            # 充值统计这边暂空,还没设计好需求
//        } else {                                                                # 首充
//            $redis->zincrby(MemKey_Stat::FirstPay_level_zset(), $level);        # 首次充值等级
//            $redis->zincrby(MemKey_Stat::FirstPay_day_zset(), $day);            # 首次充值的游戏时间
//            $redis->sadd($uid, $uid);
//        }
//        usleep(1);                                                              # 延时1微秒
//    }
//
//    /**
//     * 统计 - 商城购买
//     * @param string $zoneid
//     * @param string $uid   玩家ID
//     * @param int $itemid   道具编号
//     * @param int $amt      数量
//     */
//    public static function shopbuy($zoneid, $uid, $itemid, $amt = 1) {
//        if ($amt <= 0) {
//            return;
//        }
//        $redis = gMem();
//        # 全局
//        $redis->zincrby(MemKey_GameRun::stat_daily_ShopSales_zset($zoneid, TimeUtil::dtToday()), $itemid, $amt);
//        $redis->zincrby(MemKey_GameRun::stat_weekly_ShopSales_zset($zoneid, TimeUtil::tsWeek()), $itemid, $amt);
//        $redis->zincrby(MemKey_GameRun::stat_monthly_ShopSales_zset($zoneid, date('Ym')), $itemid, $amt);
//        $redis->lpush(MemKey_GameRun::log_ShopSales_list($zoneid), "[" . TimeUtil::dtCurrent() . "] $uid,$itemid,$amt");
//        $redis->ltrim(MemKey_GameRun::log_ShopSales_list($zoneid), 0, 1000);    # 系统销售日志保留1k条
//        # 玩家
//        $redis->zincrby(MemKey_User::stat_Shopbuy_zset($zoneid, $uid), $itemid, $amt);
//        $redis->lpush(MemKey_User::log_shopbuy_list($zoneid, $uid), "[" . TimeUtil::dtCurrent() . "] $itemid,$amt");
//        $redis->ltrim(MemKey_User::log_shopbuy_list($zoneid, $uid), 0, 30);     # 保持最新的30条记录
//        usleep(1);                                                              # 延时1微秒
//    }
//
//    /**
//     * 统计 - 神秘商城购买
//     * @param type $zoneid
//     * @param type $uid
//     * @param type $itemid
//     * @param type $amt
//     */
//    public static function secretShopbuy($zoneid, $uid, $itemid, $amt = 1) {
//        if ($amt <= 0) {
//            return;
//        }
//        $redis = gMem();
//        # 全局
//        $redis->zincrby(MemKey_GameRun::stat_daily_secretshopSales_zset($zoneid, TimeUtil::dtToday()), $itemid, $amt);
//        $redis->zincrby(MemKey_GameRun::stat_weekly_secretshopSalse_zset($zoneid, TimeUtil::tsWeek()), $itemid, $amt);
//        $redis->zincrby(MemKey_GameRun::stat_monthly_secretshopSales_zset($zoneid, date('Ym')), $itemid, $amt);
//        $redis->lpush(MemKey_GameRun::log_secretshopSales_list($zoneid), "[" . TimeUtil::dtCurrent() . "] $uid,$itemid,$amt");
//        $redis->ltrim(MemKey_GameRun::log_secretshopSales_list($zoneid), 0, 1000);  # 系统销售日志保留1k条
//        # 玩家
//        $redis->zincrby(MemKey_User::stat_SecretShopBuy_zset($zoneid, $uid), $itemid, $amt);
//        $redis->lpush(MemKey_User::log_secretshopbuy_list($zoneid, $uid), #         # 玩家个人日志
//                "[" . TimeUtil::dtCurrent() . "] $itemid,$amt");
//        $redis->ltrim(MemKey_User::log_secretshopbuy_list($zoneid, $uid), 0, 30);   # 保持最新的30条记录
//        usleep(1);
//    }
//
//// == == == == == == == == == == == == == ==
//// 提供查询功能
//// == == == == == == == == == == == == == ==
//
//    /**
//     *
//     * @param StatRequest $req
//     * @return type
//     */
//    public static function GetDataOfTask($req) {
//        $redis = gMem();
//        $maxTaskStep = 1000;                                                    # 暂时不高于1000
//        switch ($req->dateType) {                                               # 参数处理
//            case 'none':
//                $data = $redis->zrevrange(MemKey_Stat::TaskStep_zset(), 0, $maxTaskStep, true);
//                break;
//            case 'Day':
//                $ts = ($req->dateIndex > 30 ? 30 : $req->dateIndex) * 86400;
//                $data = $redis->zrevrange(MemKey_Stat::TaskStep_Day_zset(CommUtil::tsCurrent(-$ts)), 0, self::maxDays, true);
//                break;
//            case 'level':
//                $data = $redis->zrevrange(MemKey_Stat::TaskStep_level_zset($req->dateIndex), 0, self::maxLevel, true);
//                break;
//            default :
//                break;
//        }
//        $keys = array_keys($data);
//        sort($keys);
//        return array(
//            'labels' => $keys,
//            'datasets' => array(
//                array('label' => '完成人数',
//                    'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
//                    'data' => array_values(StlUtil::arraySortByKey($data))
//                )
//            )
//        );
//    }
//
//    /**
//     *
//     * @param StatRequest $req
//     * @return type
//     */
//    public static function GetUserGuideData($req) {
//        $redis = gMem();
//        $date = date_create_from_format("Ymd", $req->dateIndex);                # 参数处理
//        $ts = $date->getTimestamp();
//        $zoneid = $req->zoneid;
////
//        $skip = $redis->hgetall(MemKey_Stat::UserGuidSkip_Day($ts, $zoneid));
//        $lose = $redis->hgetall(MemKey_Stat::UserGuidLose_Day($ts, $zoneid));
//
//        switch ($req->dateType) {
//            case 'Week':
//                $skip = $redis->hgetall(MemKey_Stat::UserGuidSkip_Week($ts, $zoneid));
//                $lose = $redis->hgetall(MemKey_Stat::UserGuidLose_Week($ts, $zoneid));
//                break;
//            case 'Month':
//                $skip = $redis->hgetall(MemKey_Stat::UserGuidSkip_Month($ts, $zoneid));
//                $lose = $redis->hgetall(MemKey_Stat::UserGuidLose_Month($ts, $zoneid));
//                break;
//            case 'Day':
//            default:
//                break;
//        }
//        $keys = array_keys($lose);
//        foreach ($keys as $k) {
//            if ($k && !isset($skip[$k])) {
//                $skip[$k] = "0";
//            }
//        }
//
//        sort($keys);
//        return array(
//            'labels' => $keys,
//            'datasets' => array(
//                array('label' => '完成人数',
//                    'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
//                    'data' => array_values(StlUtil::arraySortByKey($lose))
//                ),
//                array('label' => '跳过人数',
//                    'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
//                    'borderColor' => 'rgb(0, 0, 255)',
//                    'data' => array_values(StlUtil::arraySortByKey($skip))
//                ),
//            )
//        );
//    }
//
//    /**
//     * 付费相关统计
//     * @param StatRequest $req
//     */
//    public static function GetPayStatData($req) {
//        $redis = gMem();
//// 参数处理
//        $payedusers = $redis->scard(MemKey_Stat::PayedUsers());                 # 充值总人数
//        $label = '';
//        switch ($req->dateType) {
//            case 'FirstPayDay':
//                $data = $redis->zrange(MemKey_Stat::FirstPay_day_zset(), 0, self::maxDays, true);
//                $label = '消费人数';
//                break;
//            case 'FirstPayLevel':
//                $data = $redis->zrange(MemKey_Stat::FirstPay_level_zset(), 0, self::maxLevel, true);
//                $label = '充值人数';
//                break;
//            case 'FirstYuanbaoPayAt':
//                $data = $redis->zrange(MemKey_Stat::YuanbaoFirstUsed_zset(), 0, -1, true); # 最多也不过5、6中可能流向
//                $label = '消费人数';
//                break;
//            default :
//
//                break;
//        }
//        $keys = array_keys($data);
//        sort($keys);
//        return array(
//            'labels' => $keys,
//            'datasets' => array(
//                array('label' => $label,
//                    'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
//                    'data' => array_values(StlUtil::arraySortByKey($data))
//                )
//            )
//        );
//    }
//
//    /**
//     * 玩家流失等级
//     * @param type $req
//     * @return type
//     */
//    public static function GetUserLevels($req) {
//        $redis = gMem();
//        $data = $redis->hgetall(MemKey_Stat::UserLevel_hash());
//        $keys = array_keys($data);
//        sort($keys);
//        return array(
//            'labels' => $keys,
//            'datasets' => array(
//                array('label' => '到达该等级的人数',
//                    'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
//                    'data' => array_values(StlUtil::arraySortByKey($data))
//                )
//            )
//        );
//    }
//
//}
//
///**
// * 统计类型
// */
//class StatClass {
//
//// 新手引导
//    const UserGuide = 1;
//// 任务步骤
//    const TaskStep = 2;
//// 流失等级
//    const LoseLevel = 3;
//// 生存天数
//    const LiveDays = 4;
//    // 付费相关统计
//    const PayStat = 5;
//
//}
//
//class StatRequest {
//
//    public $statType;
//    public $dateType;
//    public $dateIndex;
//    public $zoneid;
//    public $level;
//
//}
