<?php
class OthIm
{
	public function apiClass()
	{
		require_once 'lib/im/TLSSigAPI.php';
		return new Tencent\TLSSigAPI();
	}

	/**
	  * @method 调取IM接口
	  * @param  apiName             string [必填] 接口名称
	  * @param  postArr             string [必填] 接口参数
	  * @author soul
	  * @copyright 2020/6/9
	  * @return
	  */
	public function getApi($apiName, $postArr)
	{
		$res = $this->getAdminUserSig();
		$adminUser = $res['data'];
		$url = mvc::$cfg['IM']['API_HOST'].$apiName.sprintf("?sdkappid=%s&identifier=%s&usersig=%s&random=%d&contenttype=json",mvc::$cfg['IM']['APP_ID'], $adminUser['u_name'], $adminUser['imsig'], time());
		$LibHttp = new LibHttp();
		$pArr = json_encode($postArr);
		$res = $LibHttp->fetch($url, $pArr);
		$res = json_decode($res, true);
		if((isset($res['ErrorCode']) && $res['ErrorCode'] === 0) || (isset($res['ActionStatus']) && $res['ActionStatus'] == 'OK'))
		{
			return LibFc::ReturnData(true, $res);
		}
		else
		{
			return LibFc::ReturnData(false, $res['ErrorCode'].$res['ErrorInfo'].'From_Account:'.$postArr['From_Account'].' To_Account:'.$postArr['To_Account']);
		}
	}
	
	
	/**
	  * @method 生成UserSig
	  * @param  dataArr   array [必填] [unitag:xxx, utoken:xxx] unitag 二选一 utoken
	  * @author soul
	  * @copyright 2019/4/18
	  * @return {"status":true,"data":{"u_id":"149894","u_name":"soul12","u_pay_password":"94c6a8ea51fe1105cc2c5ce8a2420704","u_nickname":"55555555266","u_real_name":"欧昌宇","u_yiparts":"N","u_b2c_worker":"N","u_b2c_shopid":"149894","u_type":"2","u_ul_id":"4","u_email":"472211059@qq.com","u_emil_check":"1","u_mobile":"13535309690","u_mobile_check":"Y","u_weixin_unionid":"ok4Ppv4IBlRwm5pzM45YU6TamVNA","u_weixin_bd":"Y","u_gzh_bd":"Y","u_integral":"533","u_register_time":"1392825600","u_login_count":"8243","u_login_time":"1555554856","u_error_count":"0","u_error_ltime":"1554885284","u_logo":"Logo\/1078\/100\/c2b6ac864d2772e3.jpg","u_growth":"1160","u_from":null,"ui_period":"2022-04-22 23:59:59","unitag":"lZ0PNT5uRDBonmoxsft6MSMUbzbve0dB0OBxMsShPDVYPyJqdX16MKVQane2VH8wT3d8Mrd5dW3PW3ozl939a0QhZj0=","imsig":"eJxNjV1PgzAYRv8LtzP6tlBkJl5UNAsZS2SF6IUJqWtXKp-S4tzM-ruEsOjtOTnP8*OkMbvmu107NDa3x046dw44VxPWQjZW77XsR2jaoUJ4NrzrtMi5zd1e-AuMKPNJjQx5ABiwh8gs5Xene5nzvZ32ECEEA1zSL9kb3TajwIAIwi7An7S6lnNCiBcEweVPqxFvnrIwSh5TyVfblrofslgs17UIme8a7W5fT7flclBREH-GqvIpLZJIpeHpeXXMPOaLjBr2dnNYvytVmZrEiyB5eAHWlfWBAi705t45-wJ5JVe6"},"code":0}
	  */
	public function getUserSig($dataArr)
	{
		//登录
		$YpwUser = new YpwUser();
		$la = [];
		if(!empty($dataArr['unitag']))
		{
			$res = $YpwUser->Login('unitag', $dataArr);
		}
		else if(!empty($dataArr['utoken']))
		{
			$dataArr['token'] = $dataArr['utoken'];
			$res = $YpwUser->Login('token', $dataArr);
		}
		else
		{
			return LibFc::ReturnData(false, '获取IM sign失败！');
		}
		$userArr = $res['data'];
		unset($userArr['u_weixin_info']);
		unset($userArr['utag']);
		//生成sig
		$api = $this->apiClass();
		$api->SetAppid(mvc::$cfg['IM']['APP_ID']);
		$api->SetPrivateKey(mvc::$cfg['IM']['PRIVATE_KEY']);
		$sig = $api->genSig($userArr['u_name']);
		$userArr['imsig'] = $sig;
		return LibFc::ReturnData(true, $userArr);
	}


	/**
	  * @method 获取管理员的UserSig
	  * @author soul
	  * @copyright 2019/4/18
	  * @return {"status":true,"data":{"imsig":"eJxNjV1PgzAYRv8LtzP6tlBkJl5UNAsZS2SF6IUJqWtXKp-S4tzM-ruEsOjtOTnP8*OkMbvmu107NDa3x046dw44VxPWQjZW77XsR2jaoUJ4NrzrtMi5zd1e-AuMKPNJjQx5ABiwh8gs5Xene5nzvZ32ECEEA1zSL9kb3TajwIAIwi7An7S6lnNCiBcEweVPqxFvnrIwSh5TyVfblrofslgs17UIme8a7W5fT7flclBREH-GqvIpLZJIpeHpeXXMPOaLjBr2dnNYvytVmZrEiyB5eAHWlfWBAi705t45-wJ5JVe6"},"code":0}
	  */
	public function getAdminUserSig()
	{
		$arr = ['u_name'=>'admin', 'imsig'=>''];
		$api = $this->apiClass();
		$api->SetAppid(mvc::$cfg['IM']['APP_ID']);
		$api->SetPrivateKey(mvc::$cfg['IM']['PRIVATE_KEY']);
		$sig = $api->genSig('admin');
		$arr['imsig'] = $sig;
		return LibFc::ReturnData(true, $arr);
	}


	/**
	  * @method 导入用户
	  * @http	post
	  * @param  token              string [必填] 调用接口凭证 (post|get)
	  * @param  uids              array [必填] 用户ID数组
	  * @author soul
	  * @copyright 2019/4/18
	  * @return {"status":true,"data":,"code":0}
	  */
	public function importUser($uidArr)
	{
		foreach($uidArr as $k=>$v)
		{
			$uidArr[$k] = (int) $v;
		}
		if(!empty($uidArr))
		{
			$res = $this->getAdminUserSig();
			$adminUser = $res['data'];
			$url = sprintf("https://console.tim.qq.com/v4/im_open_login_svc/account_import?sdkappid=%s&identifier=%s&usersig=%s&random=%d&contenttype=json", 
				mvc::$cfg['IM']['APP_ID'], $adminUser['u_name'], $adminUser['imsig'], time());

			$YpwUser = new YpwUser();
			$res = $YpwUser->GetUser(['u_id', 'u_name', 'u_nickname', 'u_logo'], sprintf(" and u_id in (%s)", implode(',', $uidArr)));
			$res = $YpwUser->initUserLogo($res['data']);
			$userArr = $res['data'];
			$LibHttp = new LibHttp();
			foreach($userArr as $u)
			{
				$nickName = empty($u['u_nickname'])? $u['u_name']: $u['u_nickname'];
				$pArr = json_encode([
				'Identifier'=>$u['u_name'],
				'Nick'=>str_replace('flg', '*lg', $nickName),
				'FaceUrl'=>$u['u_logo']
				]);
				$res = $LibHttp->fetch($url, $pArr);
				$res = json_decode($res, true);
				if(!empty($res['ActionStatus']) && $res['ActionStatus'] == 'OK')
				{
					$YpwUser->Set('yp_user', ['u_im_init'=>'ok'], ' and u_id='.$u['u_id']);
				}
				else
				{
					$YpwUser->Set('yp_user', ['u_im_init'=>$res['ErrorInfo']], ' and u_id='.$u['u_id']);
					return LibFc::ReturnData(false, $u['u_name'].'初始化IM失败！'.$res['ErrorInfo'], $res['ErrorCode']);
				}
			}
		}
		return LibFc::ReturnData(true, []);
	}


	/**
	  * @method 导入需要初始化的用户
	  * @param  uids              array [必填] 用户ID数组
	  * @author soul
	  * @copyright 2019/4/18
	  * @return {"status":true,"data":,"code":0}
	  */
	public function importActUser($uidArr)
	{

		return LibFc::ReturnData(true, []);
	}


	/**
	  * @method 发送系统通知【服务、物流、订单...】
	  * @param  $uidArr	            array [必填] 接收人ID 数组
	  * @param  $msg	           string [必填] 消息内容
	  * @param  $msgType	       string [必填] 消息类型 默认im  im:服务通知  order:交易物流  admin:管理员
	  * @author soul
	  * @copyright 2020/12/5
	  * @return {"status":true,"data":[{"ErrorInfo":"","ActionStatus":"OK","ErrorCode":0,"MsgKey":"502870568_36267089_1607156552"}],"code":0,"runtime":235}
	  */
	public function sendImSysNotice($uidArr, $msg, $msgType = 'im')
	{
		if(empty($msgType)) $msgType = 'im';
		$fromUname = $msgType == 'admin'? 'admin' : 'sys_'.$msgType;
		if(empty($msg)) return LibFc::ReturnData(false, '发送内容不能为空，发送通知失败！');
		foreach($uidArr as $k=>$v)
		{
			$uidArr[$k] = (int) $v;
		}
		$uidArr = array_unique($uidArr);
		if(empty($uidArr)) return LibFc::ReturnData(false, '账号不存在，发送通知失败！');
		$YpwBase = new YpwBase();
		$res = $YpwBase->get('yp_user', ['u_id', 'u_name'], sprintf(" and u_id in (%s)", implode(',', $uidArr)));
		$userArr = $res['data'];
		if(empty($userArr)) return LibFc::ReturnData(false, '账号不存在，发送通知失败！');

		//支持一次对最多500个用户进行单发消息  
		$tempTo = [];
		$ok = 0;
		$arr = [];
		foreach($userArr as $k=>$v)
		{
			$tempTo[] = $v['u_name'];
			if(count($tempTo) == 500 || ($k+1) == count($userArr))
			{
				$postArr = [
					'From_Account'=>$fromUname,
					'To_Account'=>$tempTo,
					'MsgRandom'=>rand(0, 99999999),
					'MsgTimeStamp'=>time(),
					'MsgBody'=>[[
						'MsgType'=>'TIMTextElem',
						"MsgContent"=>[
							"Text"=>$msg
						]]
					]
				];
				$res = $this->getApi('v4/openim/batchsendmsg', $postArr);
				$arr[] = $res['data'];
			}
		}
		return LibFc::ReturnData(true, $arr);
	}


	/**
	  * @method 设置用户信息
	  * @param  $uid	            int [必填] 谁的
	  * @param  $dataArr	        array [必填] [["Tag"=>"Tag_Profile_IM_Nick", "Value"=>"MyNickName"]...]
	  * @author soul
	  * @copyright 2020/12/5
	  * @return {"status":true,"data":{"ActionStatus":"OK","ErrorCode":0,"ErrorInfo":"","ErrorDisplay":""},"code":0,"runtime":323}
	  */
	public function setImUserInfo($uid, $dataArr)
	{
		if(empty($uid)) return LibFc::ReturnData(false, '账号不存在');
		$YpwBase = new YpwBase();
		$res = $YpwBase->get('yp_user', ['u_name'], sprintf(" and u_id = %d limit 1", $uid), true);
		$uname = $res['data']['u_name'];
		if(empty($uname)) return LibFc::ReturnData(false, '账号不存在');
		$postArr = [
			'From_Account'=>$uname,
			'ProfileItem'=>$dataArr
		];
		return $this->getApi('v4/profile/portrait_set', $postArr);
	}


	/**
	  * @method 单发单聊消息
	  * @param  $from	        int/string [必填] 发送人ID或者用户名
	  * @param  $to	            int/string [必填] 发送人ID或者用户名 
	  * @param  $msg	           string [必填] 消息内容
	  * @author soul
	  * @copyright 2021/3/16
	  * @return {"status":true,"data":{"ErrorInfo":"","ActionStatus":"OK","ErrorCode":0,"MsgKey":"502870568_36267089_1607156552"},"code":0,"runtime":235}
	  */
	public function sendImMsg($from, $to, $msg)
	{
		$YpwBase = new YpwBase();
		
		$where = LibFc::Int($from)? sprintf(" and u_id=%d", $from): sprintf(" and u_name='%s'", LibFc::Escape($from));
		$res = $YpwBase->get('yp_user', ['u_id', 'u_name'], $where, true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '发送人账号不存在，发送消息失败！');
		$fromUser = $res['data'];

		$where = LibFc::Int($to)? sprintf(" and u_id=%d", $to): sprintf(" and u_name='%s'", LibFc::Escape($to));
		$res = $YpwBase->get('yp_user', ['u_id', 'u_name'], $where, true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '接收人账号不存在，发送消息失败！');
		$toUser = $res['data'];

		$postArr = [
			'SyncOtherMachine'=>1,
			'From_Account'=>$fromUser['u_name'],
			'To_Account'=>$toUser['u_name'],
			'MsgRandom'=>rand(0, 99999999),
			'MsgTimeStamp'=>time(),
			'MsgBody'=>[[
				'MsgType'=>'TIMTextElem',
				"MsgContent"=>[
					"Text"=>$msg
				]]
			]
		];
		$res = $this->getApi('v4/openim/sendmsg', $postArr);
		$arr = $res['data'];
		return LibFc::ReturnData(true, $arr);
	}

	/**
	  * @method 单发单聊自定义消息
	  * @param  $from	        int/string [必填] 发送人ID或者用户名
	  * @param  $to	            int/string [必填] 发送人ID或者用户名 
	  * @param  $msgArr	          array [必填] {"msg_type":"normal","img_type":"bottom","img":"https://file.paojd.cn/fpjl/zxl/202306/b931b0cba1191318.jpg","link_type":"zx","linkbtn":"立即查看","art_id":4561,"title":"5月产销双增长出口创新高","des":"近期，在经济恢复好转、政策效应持续释放、上年同期基数较低等因素共同作用下，工业主要生产需求指标同比增速回升明显，其中汽车产业5月整体市场表现较4月有所好转。"}
	  * @author soul
	  * @copyright 2021/3/16
	  * @return {"status":true,"data":{"ErrorInfo":"","ActionStatus":"OK","ErrorCode":0,"MsgKey":"502870568_36267089_1607156552"},"code":0,"runtime":235}
	  */
	public function sendImCustomMsg($from, $to, $msgArr)
	{
		$YpwBase = new YpwBase();

		$where = LibFc::Int($from)? sprintf(" and u_id=%d", $from): sprintf(" and u_name='%s'", LibFc::Escape($from));
		$res = $YpwBase->get('yp_user', ['u_id', 'u_name'], $where, true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '发送人账号不存在，发送消息失败！');
		$fromUser = $res['data'];

		$where = LibFc::Int($to)? sprintf(" and u_id=%d", $to): sprintf(" and u_name='%s'", LibFc::Escape($to));
		$res = $YpwBase->get('yp_user', ['u_id', 'u_name'], $where, true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '接收人账号不存在，发送消息失败！');
		$toUser = $res['data'];

		$msgArr['businessID'] = "text_link";
		$postArr = [
			'SyncOtherMachine'=>1,
			'From_Account'=>$fromUser['u_name'],
			'To_Account'=>$toUser['u_name'],
			'MsgRandom'=>rand(0, 99999999),
			'MsgTimeStamp'=>time(),
			'MsgBody'=>[[
				'MsgType'=>'TIMCustomElem',
				"MsgContent"=>[
					"Data"=>json_encode($msgArr, JSON_UNESCAPED_UNICODE),
					"Desc"=>$msgArr['title'],
					"Ext"=>"",
					"Sound"=>"",
				]]
			]
		];
		$res = $this->getApi('v4/openim/sendmsg', $postArr);
		$arr = $res['data'];
		return LibFc::ReturnData(true, $arr);
	}

	/**
	  * @method 删除会话
	   * @param  $from	        int/string [必填] 发送人ID或者用户名
	  * @param  $to	            int/string [必填] 发送人ID或者用户名 
	  * @author soul
	  * @copyright 2021/3/16
	  * @return 
	  */
	public function delUseContact($fromUid, $toUid)
	{
		$YpwBase = new YpwBase();
		$where = LibFc::Int($from)? sprintf(" and u_id=%d", $from): sprintf(" and u_name='%s'", LibFc::Escape($from));
		$res = $YpwBase->get('yp_user', ['u_id', 'u_name'], $where, true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '发送人账号不存在，发送消息失败！');
		$fromUser = $res['data'];

		$where = LibFc::Int($to)? sprintf(" and u_id=%d", $to): sprintf(" and u_name='%s'", LibFc::Escape($to));
		$res = $YpwBase->get('yp_user', ['u_id', 'u_name'], $where, true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '接收人账号不存在，发送消息失败！');
		$toUser = $res['data'];

		$postArr = [
			'From_Account'=>$fromUser['u_name'],
			'To_Account'=>$toUser['u_name'],
			'Type'=>1,
			'ClearRamble'=>1
		];
		$res = $this->getApi('v4/recentcontact/delete', $postArr);
		$arr = $res['data'];
		return LibFc::ReturnData(true, $arr);
	}


	/**
	  * @method 将用户变更为活跃用户
	  * @param  $uidArr	array [必填] 账户ID
	  * @param  $from	string [选填] 来源 默认manual shop,order,im,purchase,repair,manual(级别最高，不会自动清除)
	  * @author soul
	  * @copyright 2022/8/3
	  * @return {"status":true,"data":'ok',"code":0,"runtime":235}
	  */
	public function addImActUser($uidArr, $from = '')
	{
		if(empty($from)) $from= 'manual';
		if(!empty($uidArr))
		{
			$ids = [];
			foreach($uidArr as $id)
			{
				if($id > 0) $ids[] = (int) $id;
			}
			if(!empty($ids))
			{
				$ids = array_unique($ids);
				$now = time();
				$sqlArr = [];
				//删除级别低的
				if($from == 'manual') $sqlArr[] = sprintf("delete from im_actuser where at_from!='manual' and at_uid in (%s)", implode(',', $ids));
				//添加未有的
				$sqlArr[] = sprintf("INSERT INTO im_actuser (at_uid, at_etime, at_from)
				SELECT u_id, %d, '%s' FROM yp_user WHERE u_id IN (%s) AND u_id NOT IN (SELECT at_uid FROM im_actuser)", $now, LibFc::Escape($from), implode(',', $ids));
				$YpwBase = new YpwBase();
				$YpwBase->exeAnySql($sqlArr);
			}
		}
		return LibFc::ReturnData(true, 'ok');
	}
}