<?php
/**
  * @class 微信
  * @author soul 2022/5/27
  */
class OthWechatBot
{

	/**
	  * @method 主账号初始化
	  * @param  $wrt_id int  tokenID
	  * @author soul
	  * @return 
	  */
	public function initMainUser($wrt_id)
	{
		$B2cBase = new B2cBase();
		$res = $B2cBase->get('wx_robot_token', ['*'], sprintf(" and wrt_id=%d", $wrt_id), true);
		if(empty($res['data']) || strtotime($res['data']['wrt_endtime']) < time() || empty($res['data']['wrt_loginstatus'])){
			LibFc::ReturnData(false, '机器人token不可用');
		}
		$tokenInfo = $res['data'];

		$OthWechat = new OthWechatEy();
		$OthWechat->eywid = $tokenInfo['wrt_eywid'];

		//主账号信息
		$wxInfo = json_decode($tokenInfo['wrt_wxinfoorg'], true);
		
		$res = $OthWechat->getWxApi('getContact', ['wcId'=>$wxInfo['wcId']]);
		if(empty($res['data'][0])) return LibFc::ReturnData(false, $wxInfo['wcId'].'不存在');
		$orgWuinfo = $this->filterNull($res['data'][0]);
		$addArr = $this->formatWxUser(array_merge($wxInfo, $orgWuinfo));
		$addArr['wu']['wu_isaccout'] = 1;
		$addArr['wua']['wua_info'] = $orgWuinfo;
		$addArr['wua']['wua_status'] = 1;
		$addArr['wua']['wua_ustatus'] = 1;
		$addArr['wua']['wua_utime'] = time();
		$res = $B2cBase->get('wx_user', ['wu_address_status'], sprintf(" and wu_wxid='%s'", $addArr['wu']['wu_wxid']), true);
		if(empty($res['data']) || $res['data']['wu_address_status'] == -1){
			$addArr['wu']['wu_address_status'] = 0;
			$addArr['wu']['wu_address_status2'] = 0;
		}
		$res = $this->updateWxUser($ownerId, $addArr);
		$ownerId = $res['data'];
		return LibFc::ReturnData(true, $ownerId);
	}

	/**
	  * @method 初始化通信录列表
	  * @param  $wrt_id int  tokenID
	  * @param  $type  all|onlynew  初始化类型 onlynew:仅更新新的部分
	  * @author soul
	  * @return 
	  */
	public function updateWxUserAddrList($wrt_id, $ownerId, $type = 'onlynew')
	{
		$B2cBase = new B2cBase();
		$res = $B2cBase->get('wx_robot_token', ['*'], sprintf(" and wrt_id=%d", $wrt_id), true);
		if(empty($res['data']) || strtotime($res['data']['wrt_endtime']) < time() || empty($res['data']['wrt_loginstatus'])){
			LibFc::ReturnData(false, '机器人token不可用');
		}
		$tokenInfo = $res['data'];

		$OthWechat = new OthWechatEy();
		$OthWechat->eywid = $tokenInfo['wrt_eywid'];

		//初始化通讯录到token方
		if((time() - $tokenInfo['wrt_addrinit']) > 3600*24){
			$OthWechat->getWxApi('initAddressList');
			$B2cBase->set('wx_robot_token', ['wrt_addrinit'=>time()], sprintf(" and wrt_id=%d", $tokenInfo['wrt_id']));
		}
		
		//已有好友
		$res = $B2cBase->get('wx_user_address JOIN wx_user ON wua_wu_id = wu_id', ['wu_id','wua_id', 'wu_wxid'], sprintf(" and wua_mwu_id=%d", $ownerId));
		$hasArr = array_column($res['data'], 'wu_wxid', 'wua_id');

		$wxids = [];
		//个微获取通信录
		$res = $OthWechat->getWxApi('getAddressList');
		if($res['data']['friends']) $wxids = $res['data']['friends'];

		//企微通信录
		$res = $OthWechat->getWxApi('getImAddressList');
		if($res['data']) $wxids = array_merge($wxids, array_column($res['data'], 'userName'));
		$B2cBase->B2CDb->Begin();
		if($wxids){
			$res = $B2cBase->get('wx_user', ['wu_id', 'wu_wxid'], sprintf(" and wu_wxid in ('%s')", implode("','", $wxids)));
			$hasWuArr = array_column($res['data'], 'wu_id', 'wu_wxid');
			foreach($wxids as $wxid){
				if($hasArr[$wxid]){//是否已经建立关系
					if($type == 'all'){
						$B2cBase->set('wx_user_address', ['wua_status'=>1, 'wua_ustatus'=>1], sprintf(" and wua_id=%d", $hasArr[$wxid]));
					}
				}else{
					if($hasWuArr[$wxid]){
						$wu_id = $hasWuArr[$wxid];
					}else{
						$res = $B2cBase->add('wx_user', ['wu_wxid'=>$wxid, 'wu_atime'=>time()]);
						$wu_id = $res['data'];
					}
					$B2cBase->add('wx_user_address', ['wua_mwu_id'=>$ownerId, 'wua_wu_id'=>$wu_id, 'wua_atime'=>time()]);
				}
			}
			$B2cBase->set('wx_user_address', ['wua_status'=>-1, 'wua_etime'=>time()], sprintf(" and wua_mwu_id != wua_wu_id and wua_mwu_id=%d and wua_wu_id not in (select distinct wu_id from wx_user where wu_isaccout = 0 and wu_wxid in ('%s'))", $ownerId, implode("','", $wxids)));
		}
		if($type == 'all'){
			$B2cBase->set('wx_user', ['wu_address_status'=>1, 'wu_address_utime'=>time(), 'wu_address_utime2'=>1, 'wu_address_utime2'=>time()], sprintf(" and wu_id = %d", $ownerId));
		}else{
			$B2cBase->set('wx_user', ['wu_address_utime2'=>1, 'wu_address_utime2'=>time()], sprintf(" and wu_id = %d", $ownerId));
		}
		$B2cBase->B2CDb->End();
		return LibFc::ReturnData(true, $ownerId);
	}

	/**
	  * @method 更新通信录的指定用户信息
	  * @param  $wrt_id int  tokenID
	  * @param  $ownerId int  主账号ID
	  * @param  $upids array  指定更新对应的值 ['wxid_fncwtpljs2qp22', 'wxid_tttgfgzuy2do22']
	  * @author soul
	  * @return 
	  */
	public function updateWxUserAddrByWxids($eywid, $ownerId, $upids){
		$OthWechat = new OthWechatEy();
		$OthWechat->eywid = $eywid;
		$arr = [];
		//需要处理的
		$needArr = [
			'wxuser'=>[],	
			'wxwork'=>[],
		];
		foreach($upids as $tid){
			if(stripos($tid, '@openim')){
				$needArr['wxwork'][] = $tid;
			}else{
				$needArr['wxuser'][] = $tid;
			}
		}
		
		foreach($needArr as $ntype=>$wxids){
			if($ntype == 'wxuser'){
				foreach(array_chunk($wxids, 20) as $tids){
					$res = $OthWechat->getWxApi('getContact', ['wcId'=>implode(',', $tids)]);
					foreach($res['data'] as $tinfo){
						if($tinfo['userName']){
							$tinfo = $this->filterNull($tinfo);
							$addArr = $this->formatWxUser($tinfo);
							$addArr['wua']['wua_info'] = $tinfo;
							$addArr['wua']['wua_status'] = 1;
							$addArr['wua']['wua_ustatus'] = 2;
							$addArr['wua']['wua_utime'] = time();
							$res = $this->updateWxUser($ownerId, $addArr);
							$arr[$addArr['wu']['wu_wxid']] = $res['data'];
						}
					}
					usleep(rand(500000, 1000000));
				}
			}else if($ntype == 'wxwork'){
				foreach($wxids as $tid){
					$res = $OthWechat->getWxApi('getOpenImContact', ['wcId'=>$tid]);
					$tinfo = $res['data'];
					if($tinfo['userName']){
						$tinfo = $this->filterNull($tinfo);
						$addArr = $this->formatWxUser($tinfo);
						$addArr['wua']['wua_info'] = $tinfo;
						$addArr['wua']['wua_status'] = 1;
						$addArr['wua']['wua_ustatus'] = 2;
						$addArr['wua']['wua_utime'] = time();
						$res = $this->updateWxUser($ownerId, $addArr);
						$arr[$addArr['wu']['wu_wxid']] = $res['data'];
					}
					usleep(rand(500000, 1000000));
				}
			}
		}
		return LibFc::ReturnData(true, $arr);
	}

	//微信用户添加或者更新 ['wu'=>[], 'wua'=>[]]
	public function updateWxUser($ownerId, $addArr)
	{
		$wuArr = $addArr['wu'];
		$wuaArr = $addArr['wua'];
		$now = time();
		if(empty($wuArr['wu_wxid'])) LibFc::ReturnData(false, '微信ID wu_wxid必填');
		if(isset($wuaArr['wua_info']) && is_array($wuaArr['wua_info'])) $wuaArr['wua_info'] = LibFc::jsonEncode($wuaArr['wua_info']);
		$wuArr['wu_etime'] = $now;
		$wuaArr['wua_etime'] = $now;
		$B2cBase = new B2cBase();
		if($wuArr['wu_wordingid']) $wuArr['wu_type'] = 'wxwork';
		$B2cBase->B2CDb->Begin();
		$res = $B2cBase->get('wx_user', ['wu_id'], sprintf(" and wu_wxid='%s'", $wuArr['wu_wxid']), true);
		if(!empty($res['data'])){
			$wu_id = $res['data']['wu_id'];
			if(empty($ownerId)) LibFc::ReturnData(false, 'ownerId主微信用户必填');
			$B2cBase->set('wx_user', $wuArr, sprintf(" and wu_id=%d", $wu_id));
			$B2cBase->set('wx_user_address', $wuaArr, sprintf(" and wua_mwu_id=%d and wua_wu_id=%d", $ownerId, $wu_id));
		}else{
			//主信息
			$wuArr['wu_atime'] = $now;
			$res = $B2cBase->add('wx_user', $wuArr);
			$wu_id = $res['data'];
			//好友关联
			$wuaArr['wua_mwu_id'] = !empty($ownerId)? $ownerId: $wu_id;
			$wuaArr['wua_wu_id'] = $wu_id;
			$wuaArr['wua_atime'] = $now;
			$B2cBase->add('wx_user_address', $wuaArr);
		}
		$B2cBase->B2CDb->End();
		return LibFc::ReturnData(true, $wu_id);
	}

	//移除空的字段
	public function filterNull($info)
	{
		return array_filter($info, function ($v) {
			return $v !== null && $v !== '' && $v !== [];
		});
	}
	
	//微信源数据转字段
	public function formatWxUser($info)
	{
		$arr = [];
		$link = [
			'wu'=>[
				'userName'=>'wu_wxid',
				'aliasName'=>'wu_weixin',
				'nickName'=>'wu_nickname',
				'sex'=>'wu_sex',
				'smallHead'=>'wu_headimg',
				'mobilePhone'=>'wu_mobile',
				'country'=>'wu_country',
				'province'=>'wu_province',
				'city'=>'wu_city',
				'wordingId'=>'wu_wordingid',
				'wording'=>'wu_wording',
			],
			'wua'=>[
				'remark'=>'wua_rename',
				'signature'=>'wua_signature',
				'phoneNumList'=>'wua_mobiles'
			]
		];
		foreach($link as $k=>$vs){
			foreach($vs as $kk=>$vv){
				if(isset($info[$kk]) && $info[$kk] !== null && $info[$kk] !== ''){
					if(is_array($info[$kk])) $info[$kk] = implode(',', $info[$kk]);
					$arr[$k][$vv] = $info[$kk];
				}
			}
		}
		return $arr;
	}


	/**
	  * @method 绑定微信用户和宜配会员
	  * @param  $wuids array [1,2,3...]
	  * @author soul
	  * @return 
	  */
	public function linkWxUserToYpUser($wuids){
		$B2cBase = new B2cBase();
		$YpwBase = new YpwBase();
		$wuids = array_map('intval', $wuids);
		$arr = [];

		$ures = $B2cBase->get('wx_user join wx_user_address on wu_id=wua_wu_id', ['wu_id', 'wu_weixin', 'wu_nickname', 'wu_headimg', 'wu_mobile', 'group_concat(wua_rename) wua_rename', 'group_concat(wua_signature) wua_signature', 'group_concat(wua_mobiles) wua_mobiles'], sprintf(" and wu_id in (%s) group by wu_id", implode(',', $wuids)));
		$noArr = [];
		foreach($ures['data'] as $v){
			//手机号匹配
			$v['wu_uid'] = 0;	
			foreach(['wu_mobile', 'wua_mobiles', 'wu_weixin', 'wu_nickname', 'wua_rename', 'wua_signature'] as $mv){
				if(!empty($v[$mv]) && preg_match_all('/1[3-9]\d{9}/', $v[$mv], $matches)){
					$res = $YpwBase->get('yp_user', ['u_id'], sprintf(" and u_mobile in ('%s') and u_mobile_check='Y'", implode("','", $matches[0])));
					if(!empty($res['data'])){
						$v['wu_uid'] = $res['data'][0]['u_id'];
						$B2cBase->set('wx_user', ['wu_uid'=>$v['wu_uid']], sprintf(" and wu_id=%d", $v['wu_id']));
						$arr[$v['wu_id']] = $v['wu_uid'];
						unset($userArr[$wuid]);
						break;
					}
				}
			}
			if(empty($v['wu_uid']) && !empty($v['wu_headimg']) && !empty($v['wu_nickname'])){
				$v['wu_headimg_md5'] = md5($v['wu_headimg']);
				$noArr[] = $v;
			}
		}
		//头像和昵称匹配
		if($noArr){
			//忽略的图片
			$ignoreImg = ['-1'];
			$res = $YpwBase->get('wx_img_hash', ['wih_md5'], " GROUP BY wih_md5 HAVING COUNT(*) > 10");
			$ignoreImg = array_merge($ignoreImg, array_column($res['data'], 'wih_md5'));

			//批量取
			$res = $YpwBase->get('wx_img_hash', ['wih_urlmd5', 'wih_md5', 'wih_dhash'], sprintf(" and wih_urlmd5 in ('%s') and wih_md5 not in ('%s')", implode("','", array_column($noArr, 'wu_headimg_md5')), implode("','", $ignoreImg)));
			$imgArr = array_column($res['data'], null, 'wih_urlmd5');
			
			if($imgArr){
				$table = "yp_user JOIN wx_img_hash b ON u_weixin_bd = 'Y' AND MD5(JSON_UNQUOTE(u_weixin_info->'$.headimgurl')) = wih_urlmd5";
				//头像内容一致且昵称一致  不用昵称in(清江汽配\北汽\五菱\宝骏\东风风光)
				$res = $YpwBase->get($table, ['u_id', "JSON_UNQUOTE(u_weixin_info->'$.nickname') nickname", 'wih_md5', 'wih_dhash'], sprintf(" AND JSON_UNQUOTE(u_weixin_info->'$.nickname') in (SELECT wu_nickname FROM ypb2c.`wx_user` WHERE wu_id IN (%s)) and wih_md5 not in ('%s')", implode(',', array_column($noArr, 'wu_id')), implode("','", $ignoreImg)));
				$likeArr = [];
				foreach($res['data'] as $tvv){
					$likeArr[md5($tvv['nickname'])][] = $tvv;
				}
				foreach($noArr as $k=>$v){
					if(empty($imgArr[$v['wu_headimg_md5']])) continue;
					$imgInfo = $imgArr[$v['wu_headimg_md5']];
					if(empty($likeArr[md5($v['wu_nickname'])])) continue;
					$nickImgs = $likeArr[md5($v['wu_nickname'])];
					
					//完全一致
					foreach($nickImgs as $tvv){
						if($tvv['wih_md5'] == $imgInfo['wih_md5']){
							$v['wu_uid'] = $tvv['u_id'];
							break;
						}
					}
					if(empty($v['wu_uid'])){
						$minRow = [];
						//头像相似度比较
						foreach($nickImgs as $tvv){
							$tvv['dist'] = LibFc::distanceDhash($imgInfo['wih_dhash'], $tvv['wih_dhash']);
							if(empty($minRow) || $tvv['dist'] < $minRow['dist']){
									$minRow = $tvv;
							}
						}
						if(!empty($minRow) && $minRow['dist'] <= 5){
							$v['wu_uid'] = $minRow['u_id'];
						}
						//echo $v['wu_headimg'].'=>'.LibFc::jsonEncode($minRow)."\n";
					}
					if($v['wu_uid']){
						$B2cBase->set('wx_user', ['wu_uid'=>$v['wu_uid']], sprintf(" and wu_id=%d", $v['wu_id']));
						$arr[$v['wu_id']] = $v['wu_uid'];
						unset($noArr[$k]);
					}
				}
			}		
		}
		return LibFc::ReturnData(true, $arr);
	}
}