<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------

namespace Home\Model;
use Think\Model;

/**
 * 分类模型
 */
class UserModel extends Model{

    protected $_validate = array(

    );

    protected $_auto = array(
    );

    /**
     * 构造函数
     * @param string $name 模型名称
     * @param string $tablePrefix 表前缀
     * @param mixed $connection 数据库连接信息
     */
    public function __construct($name = '', $tablePrefix = '', $connection = '') {
        /* 设置默认的表前缀 */
        $this->tablePrefix ='tab_';
        /* 执行构造方法 */
        parent::__construct($name, $tablePrefix, $connection);
    }


    /**
     * 按照时间分组统计注册总数
     * @param integer           $start          开始时间(时间戳)
     * @param integer           $end            结束时间(时间戳)
     * @param integer           $game_id        游戏编号
     * @param integer/string    $promote_id     渠道编号或渠道编号列表字符串(字符串逗号分隔)
     * @return array            详细数据
     * @author 鹿文学
     */
    public function register_count_by_time($start,$end,$game_id=0,$promote_id=0,$group='time') {

        $map['lock_status']=1;

        $map['register_time'] = array('between',array($start,$end));

        $map['fgame_id'] = $game_id>0?$game_id:array('egt',0);

        $map['promote_id'] = is_numeric($promote_id)?$promote_id:array('in',$promote_id);

        $data = $this->field("FROM_UNIXTIME(register_time,'%Y-%m-%d') as $group,count(id) as register_num")

            ->where($map)->group($group)->select();

        return $data;
    }


    /**
     * 按照时间分组统计登录总数
     * @param integer           $start          开始时间(时间戳)
     * @param integer           $end            结束时间(时间戳)
     * @param integer           $game_id        游戏编号
     * @param integer/string    $promote_id     渠道编号或渠道编号列表字符串(字符串逗号分隔)
     * @return array            详细数据
     * @author 鹿文学
     */
    public function login_count_by_time($start,$end,$game_id=0,$promote_id=0,$group='time') {

        $tmap['lock_status']=$map['lock_status']=1;
        $tmap['register_time']=$map['up.login_time'] = array('between',array($start,$end));

        if($game_id>0) {
            $tmap['fgame_id']=$map['up.game_id'] = $game_id;
        }

        $tmap['promote_id']=$map['tab_user.promote_id'] = is_numeric($promote_id)?$promote_id:array('in',$promote_id);

        /* $data = $this->field("FROM_UNIXTIME(up.login_time,'%Y-%m-%d') as $group,count(distinct up.user_id) as login_num")

            ->join('tab_user_login_record up on up.user_id=tab_user.id','right')

            ->where($map)->group($group)->select(); */

				$union = $this->field('FROM_UNIXTIME(register_time,"%Y-%m-%d") as '.$group.',GROUP_CONCAT(DISTINCT id) as user_id')
							->where($tmap)->group($group)->select(false);

				$sql = $this->field('FROM_UNIXTIME(up.login_time,"%Y-%m-%d") as '.$group.',GROUP_CONCAT(DISTINCT up.user_id) as user_id')
						->join('tab_user_login_record up on up.user_id=tab_user.id','inner')
						->union($union)
						->where($map)->group($group)->select(false);

				$lists = $this->table('('.$sql.') as a')->field('a.'.$group.',GROUP_CONCAT(a.user_id) as user_id')->group('a.'.$group)->select();

				foreach($lists as $k => $v) {
					$login = array_unique(explode(',',$v['user_id']));
					$data[$k] = array(
						$group => $v[$group],
						'login_num' => count($login),
					);
				}

        return $data;

    }

    /**
     * 按照时间分组统计注册编号序列
     * @param integer           $start          开始时间(时间戳)
     * @param integer           $end            结束时间(时间戳)
     * @param integer           $game_id        游戏编号
     * @param integer/string    $promote_id     渠道编号或渠道编号列表字符串(字符串逗号分隔)
     * @param integer           $lock_status    用户状态(1正常,0锁定)
     * @return array            详细数据
     * @author 鹿文学
     */
    public function register_list_by_time($start,$end,$game_id,$promote_id,$group='time',$lock_status=1) {

        $dateform = '%Y-%m-%d';

        $map['fgame_id'] = $game_id>0?$game_id:array('egt',0);

        $map['promote_id'] = is_numeric($promote_id)?$promote_id:array('in',$promote_id);

        $map['register_time'] = array('between',array($start,$end));

		$map['puid'] = 0;

		if(is_numeric($lock_status) && ($lock_status==1 or $lock_status==0)) {

            $map['lock_status']=$lock_status;

        }


        $data = $this
                ->field('group_concat(id) as id,FROM_UNIXTIME(register_time,"'.$dateform.'") as '.$group)
                ->where($map)->group($group)->select();
        return $data;

    }

    /**
     * 按照时间分组统计注册编号序列
     * @param string            $newslist       新玩家序列
     * @param integer           $end            结束时间(时间戳)
     * @param integer           $game_id        游戏编号
     * @param integer/string    $promote_id     渠道编号或渠道编号列表字符串(字符串逗号分隔)
     * @param integer           $flag           留存类型
     * @return array            详细数据
     * @author 鹿文学
     */
    public function ratention_rate($newslist,$game_id=0,$promote_id=0,$flag=1) {

        $map['lock_status']=1;
        if($game_id>0) {
            $map['up.game_id'] = $game_id;
        }
        /*$map['up.game_id'] = $game_id>0?$game_id:array('egt',0);*/

        /*$map['up.promote_id'] = */$map['tab_user.promote_id'] = is_numeric($promote_id)?$promote_id:array('in',$promote_id);

        $group = 'up.login_time';

        $fieldname = 'retention_rate'.$flag;

        foreach ($newslist as $value) {
            $ct1 = strtotime("+$flag day",strtotime($value['time']));
            $ct2 = strtotime("+1 day",$ct1)-1;

            $map[$group] = array(array('egt',$ct1),array('elt',$ct2));

            $map['user_id']=array('in',$value['id']);
            $count = count(explode(',',$value['id']));

            $d=$this
                ->field('count(distinct up.user_id) as '.$fieldname.' ,FROM_UNIXTIME(up.login_time,"%Y-%m-%d") as play_time')
                ->join('tab_user_login_record up on tab_user.id=up.user_id','right')
                ->where($map)
                ->group('play_time')
                ->select();

            if ($d)
                $data[]=array(
                    "play_time"=>$value['time'],
                    $fieldname=>($d[0][$fieldname]==0)?0:sprintf("%.2f",($d[0][$fieldname]/$count)*100)
                );
        }
        return $data;
    }



}