<?php
/**
  * @method 消息推送管理
  * @author liao
  * @copyright 2017/9/26
  */
class B2cNotice extends B2cBase
{
	/**
	 * @method    返回消息类型
	 * @author     廖
	 * @copyright 2017-09-27
	 * @return    array('system','track','promotion','private');
	 */
	public function getNoticeType()
	{
		return array('system'=>'系统公告','track'=>'物流','promotion'=>'优惠促销','private'=>'私信');
	}
	/**
	 * @method    登陆时有效消息入库
	 * @param     [int]          $uid [登陆用户id]
	 * @author     廖
	 * @copyright 2017-10-17
	 */
	public function setNoticesInsert($uid)
	{
		if(LibFc::Int($uid))
		{
			$data = $this->getUserAllowNoticeType($uid);
			if(!empty($data))
			{
				$table = sprintf("(select * from us_notice left join us_notice_link on not_id=nol_not_id where not_type in ('%s') and not_end_time>%d and not_all_user=1 and (nol_uid=%d or nol_uid is null)) as a",implode("','",$data),time(),$uid);
				$res = $this->get($table,['not_id'],' and  nol_uid is null');
				if(!empty($res['data']))
				{
					foreach ($res['data'] as $value) 
					{
						$this->add('us_notice_link',['nol_not_id'=>$value['not_id'],'nol_uid'=>$uid]);
					}
				}
			}
		}
		else return LibFc::ReturnData(false,'setNoticesInsert 参数不正确!');
	}
	/**
	 * @method    获取类型消息的详细信息
	 * @param     [int]        $nowPage  [当前页]
	 * @param     [int]        $perPage  [每页条数]
	 * @param     [int]        $Total    [总条数]
	 * @param     [str]        $where    [查询条件]
	 * @param     [int]        $userId   [当前用户id]
	 * @author     廖
	 * @copyright 2017-10-17
	 * @return
	 */
	public function getNoticeInfo($nowPage,$perPage,$total,$where,$order,$userId)
	{
		if(LibFc::Int($nowPage) && LibFc::Int($perPage) && LibFc::Int($userId))
		{
			$where .= sprintf(' limit %d,%d', ($nowPage-1)*$perPage, $perPage);
			$res = $this->get('us_notice left join us_notice_link on not_id=nol_not_id', ['*'], $where);
			// print_r($res);
			//把该页的消息标记为已读
			if(!empty($res['data']))
			{
				$uidArr = array();
				foreach ($res['data'] as $value) 
				{
					if($value['nol_read'] =='0')
					{
						if(LibFc::Int($value['nol_not_id']))
						{
							$uidArr[] = $value['nol_not_id'];
						}
					}
				}
				if(!empty($uidArr))
				{
					$this->Set('us_notice_link',['nol_read'=>'1'],sprintf(' and nol_not_id in (%s) and nol_uid=%d',implode(',',$uidArr),$userId));
				}
			}
			//私信消息获取发送方
			if($order == 'private')
			{
				if(!empty($res['data']))
				{
					$Uid = array_unique(array_merge(array_column($res['data'],'not_send_uid'),array_column($res['data'],'nol_uid')));
					if(!empty($Uid))
					{
						$nameData = $this->get('us_user_base',['ub_uid','ub_username'],sprintf(' and ub_uid in (%s)',implode(',',$Uid)));
						$nameData = array_column($nameData['data'], 'ub_username','ub_uid');
						foreach ($res['data'] as $key=>$value) 
						{
							$res['data'][$key]['sendName'] = $nameData[$value['not_send_uid']];
							$res['data'][$key]['fromName'] = $nameData[$value['nol_uid']];
						}
						
					}
				}
			}
			return $res;
		}
		return LibFc::ReturnData(false,'getNoticeInfo 参数不正确!');
	}
	/**
	 * @method    获取用户打开的消息类型
	 * @param     [int]                 $uid  [用户id]
	 * @author     廖
	 * @copyright 2017-10-18
	 * @return    ['system','private',...]
	 */
	public function getUserAllowNoticeType($uid)
	{
		$open = $this->get('us_user_base',['ub_notice_system','ub_notice_private','ub_notice_track','ub_notice_promotion'],' and ub_uid='.$uid,true);
		$data = array();
		if($open['data']['ub_notice_system']=='1')
		{
			$data[] = 'system';
		}
		if($open['data']['ub_notice_private']=='1')
		{
			$data[] = 'private';
		}
		if($open['data']['ub_notice_track']=='1')
		{
			$data[] = 'track';
		}
		if($open['data']['ub_notice_promotion']=='1')
		{
			$data[] = 'promotion';
		}
		return $data;
	}
	/**
	 * @method    获取有效消息条数
	 * @param     [int]       $uid  [当前用户id]
	 * @author     廖
	 * @copyright 2017-10-17
	 * @return    ['status'=>ture,'data'=>['private'=>111,....]]
	 */
	public function getNoticeCount($uid)
	{
		if(LibFc::Int($uid))
		{
			$data = $this->getUserAllowNoticeType($uid);
			//计算消息总条数
			if(!empty($data))
			{
				$res = $this->get('us_notice left join us_notice_link on not_id=nol_not_id',['count(*) count','not_type'],sprintf(" and not_end_time>%d and (nol_uid=%d or not_send_uid=%d) and nol_delete=0 and not_type in ('%s') group by not_type",time(),$uid,$uid,implode("','", $data)));
				$dataArr = array_column($res['data'],'count', 'not_type');
				foreach ($data as $key => $value) 
				{
					$dataArr[$value] = $dataArr[$value]?$dataArr[$value]:0;
				}
				return LibFc::ReturnData(true,$dataArr);
			}
			
		}
		else return LibFc::ReturnData(false,'getNoticeCount 参数不正确!');
	}
	/**
	 * @method    获取有效消息条数
	 * @param     [int]       $uid  		[用户id]
	 * @param     [bool]      $typeCount  	[总数true 分类总数false]
	 * @author     廖
	 * @copyright 2017-10-17
	 * @return    ['status'=>ture,'data'=>'1'] | ['status'=>ture,'data'=>['count'=>xxx]]
	 */
	public function getNoticeNoReadCount($uid,$typeCount=false)
	{
		if(LibFc::Int($uid))
		{
			$data = $this->getUserAllowNoticeType($uid);
			//计算未读消息总条数
			if(!empty($data))
			{
				if($typeCount)
				{
					$res = $this->get('us_notice left join us_notice_link on not_id=nol_not_id',['count(*) count'],sprintf(" and not_type in ('%s') and not_end_time>%d and nol_uid=%d and nol_read=0 and nol_delete=0",implode("','",$data),time(),$uid),true);
					return $res;
				}else//未读每个状态总条数
				{
					$res = $this->get('us_notice left join us_notice_link on not_id=nol_not_id',['count(*) count','not_type'],sprintf(" and not_end_time>%d and nol_uid=%d and nol_read=0 and nol_delete=0 and not_type in ('%s') group by not_type",time(),$uid,implode("','", $data)));
					$dataArr= array_column($res['data'],'count','not_type');
					return LibFc::ReturnData(true,$dataArr);
				}
			}
			
		}
		else return LibFc::ReturnData(false,'getNoticeCount 参数不正确!');
	}
	/**
	 * @method    添加消息
	 * @param     [arrry]     $dataArr [消息数组]
	 * @param     array       $uidArr  [用户id Arr]
	 * @author     廖
	 * @copyright 2017-09-26
	 * @return    ['status'=>true,'data'=>true]
	 */
	public function addNotice($dataArr, $uidArr=[])
	{
		$typeArr = $this->getNoticeType();
		if(LibFc::Int($dataArr['not_send_uid']) && array_key_exists($dataArr['not_type'], $typeArr) && !empty($dataArr['not_txt']))
		{	
			$dataArr['not_add_time'] = time();
			$dataArr['not_all_user']=='1'?$dataArr['not_all_user']:$dataArr['not_all_user']='0';
			$re =  $this->add('us_notice',$dataArr,['not_txt']);
			$dataArr['not_id'] = $re['data'];
			if(!empty($uidArr) && $dataArr['not_all_user'] == '0')
			{
				$this->addNoticeLinkByNotId($uidArr, $dataArr['not_id']);
			}
			return LibFc::ReturnData(true,$dataArr['not_id']);
		}
		else return LibFc::ReturnData(false,'addNotice 参数不正确');
	}
	/**
	 * @method    消息关联到多用户
	 * @param     [array]              $uidArr [用户id Arr]
	 * @param     [int]                $notId  [消息id]
	 * @author     廖
	 * @copyright 2017-09-26
	 * @return
	 */
	public function addNoticeLinkByNotId($uidArr, $notId)
	{
		if(!empty($uidArr) && is_array($uidArr) && LibFc::Int($notId))
		{
			$uidArr = array_filter($uidArr,'LibFc::Int');
			if(!empty($uidArr))
			{
				$re = $this->getFieldUnival('us_notice_link','nol_uid',sprintf(' and nol_not_id=%d and nol_uid in (%s)',$notId,implode(',',$uidArr)));
				$uidArr = array_diff($uidArr,$re['data']);
				if(!empty($uidArr))
				{
					$this->B2CDb->Begin();
					foreach ($uidArr as $uidValue) 
					{
						$dataArr = [
							'nol_not_id'=>$notId,
							'nol_uid'=>$uidValue
						];
						$this->add('us_notice_link',$dataArr);
					}
					$this->B2CDb->End();
				}
				return LibFc::ReturnData(true,true);	
			}
			else return LibFc::ReturnData(false,'addNoticeLinkByNotId 参数不正确');
		}
		else return LibFc::ReturnData(false,'addNoticeLinkByNotId 参数不正确');
	}
	/**
	 * @method    用户添加多条消息关联
	 * @param     [array]            $notIdArr [消息id]
	 * @param     [uid]              $uid      [用户id]
	 * @author     廖
	 * @copyright 2017-09-26
	 * @return
	 */
	public function addNoticeLinkByUid($notIdArr, $uid)
	{
		if(!empty($notIdArr) && is_array($notIdArr) && LibFc::Int($uid))
		{
			$notIdArr = array_filter($notIdArr,'LibFc::Int');
			if(!empty($notIdArr))
			{
				$re = $this->getFieldUnival('us_notice_link','nol_not_id',sprintf(' and nol_not_id in (%s) and nol_uid=%d',implode(',',$notIdValue),$uid));
				$notIdArr = array_diff($notIdArr,$re['data']);
				if(!empty($notIdArr))
				{
					$this->B2CDb->Begin();
					foreach ($notIdArr as $notIdValue) 
					{
						$dataArr = [
							'nol_not_id'=>$notIdValue,
							'nol_uid'=>$uid,
						];
						$this->add('us_notice_link',$dataArr);
					}
					$this->B2CDb->End();
				}
				return LibFc::ReturnData(true,true);
			}
			else return LibFc::ReturnData(false,'addNoticeLinkByUid 参数不正确');
		}
		else return LibFc::ReturnData(false,'addNoticeLinkByUid 参数不正确');
	}
	/**
	 * @method    已读信息
	 * @param     [array]        $notIdArr [消息id arr]
	 * @param     [int]          $uid       [用户id]
	 * @author     廖
	 * @copyright 2017-09-26
	 * @return
	 */
	public function setNoticeRead($notIdArr, $uid)
	{
		if(!empty($notIdArr) && is_array($notIdArr) && LibFc::Int($uid))
		{
			$notIdArr = array_filter($notIdArr,'LibFc::Int');
			if(!empty($notIdArr))
			{
				$this->Set('us_notice_link',['nol_read'=>'1'],sprintf(' and nol_uid=%d and nol_not_id in (%s)',$uid,implode(',', $notIdArr)));
				return LibFc::ReturnData(true,true);
			}
			else return LibFc::ReturnData(false,'setNoticeRead 参数不正确');
		}
		else return LibFc::ReturnData(false,'setNoticeRead 参数不正确');
	}
	/**
	 * @method    用户删除消息
	 * @param     [array]        $notIdArr [消息id Arr]
	 * @param     [int]          $uid      [用户id]
	 * @author     廖
	 * @copyright 2017-09-26
	 * @return
	 */
	public function setNoticeDelte($notIdArr, $uid)
	{
		if(!empty($notIdArr) && is_array($notIdArr) && LibFc::Int($uid))
		{
			$notIdArr = array_filter($notIdArr,'LibFc::Int');
			if(!empty($notIdArr))
			{
				$this->Set('us_notice_link',['nol_delete'=>'1'],sprintf(' and nol_uid=%d and nol_not_id in (%s)',$uid,implode(',', $notIdArr)));
				return LibFc::ReturnData(true,true);
			}
			else return LibFc::ReturnData(false,'setNoticeDelte 参数不正确');
		}
		else return LibFc::ReturnData(false,'setNoticeDelte 参数不正确');
	}
	/**
	 * @method    添加群体消息到用户
	 * @param     [int]           $uid [用户id]
	 * @author     廖
	 * @copyright 2017-09-27
	 * @return
	 */
	public function updateUserNotice($uid)
	{
		if(LibFc::Int($uid))
		{
			$re = $this->get('us_notice',['not_id','not_type']," and not_all_user='1' and not_end_time>".time());
			if(!empty($re['data']))
			{
				$res = $this->get('us_user_base',['ub_notice_system','ub_notice_private','ub_notice_track','ub_notice_promotion'],' and ub_uid='.$uid,true);
				$notIdArr = array();
				foreach ($re['data'] as $notValue) 
				{
					switch ($notValue['not_type']) 
					{
						case 'system':
							if($res['data']['ub_notice_system'])
							{
								$dataArr[]=$notValue['not_id'];
							}
							break;
						case 'track':
							if($res['data']['ub_notice_private'])
							{
								$dataArr[]=$notValue['not_id'];
							}
							break;
						case 'promotion':
							if($res['data']['ub_notice_track'])
							{
								$dataArr[]=$notValue['not_id'];
							}
							break;
						case 'private':
							if($res['data']['ub_notice_promotion'])
							{
								$dataArr[]=$notValue['not_id'];
							}
							break;
					}
				}
				$notIdArr = array_unique($notIdArr);
				$re = $this->addNoticeLinkByUid($notIdArr,$uid);
				return $re;
			}
			else return LibFc::ReturnData(true,true);
		}
		else return LibFc::ReturnData(false,'updateUserNotice 参数不正确');
	}
}