<?php

/**
 * @method 微信机器人
 * @author zhengweihua 
 * @copyright 2022-05-30
 */
class B2cWxRobot extends B2cBase
{

    /**
     * @param   $wr_id [int] 机器人ID
     * @param   $dataArr [Array]
     * @method 保存机器人
     * @author zhengweihua 
     * @copyright 2022-05-30
     */
    public function setWxRobot($wr_id,$data)
    {
        if (empty($data) || !is_array($data)) return LibFc::ReturnData(false, '参数错误');
        $wr_id = (int)$wr_id;
        // $res = $this->get('wx_robot', ['wr_id'], sprintf(" and wr_uid=%d and wr_type='%s' and wr_totype='%s'",(int)$data['wr_uid'],LibFc::Escape($data['wr_type']),LibFc::Escape($data['wr_totype'])), true);
        // if(!empty($res['data']))
        // {   
        //     $link = mvc::$cfg['ADMIN_URI'].'shop/robotSet?wr_id='.$res['data']['wr_id'];
        //     $errorMsg = '该用户已存在同类型机器人,不可重复添加,<a class="a-blue" href="'.$link.'">点击去设置</a>';
        //     if($res['data']['wr_id'] != $wr_id) return LibFc::ReturnData(false,$errorMsg);
        // }
        if (in_array($data['wr_type'], ['super', 'gzh', 'wxgzh'])) {
            $res = $this->get('wx_robot', ['wr_id'], sprintf(" and wr_wxnum='%s'", LibFc::Escape($data['wr_wxnum'])), true);
            if (!empty($res['data'])) {
                $link = mvc::$cfg['ADMIN_URI'] . 'shop/robotSet?wr_id=' . $res['data']['wr_id'];
                $errorMsg = '该公众号原始ID已存在,不可重复添加,<a class="a-blue" href="' . $link . '">点击去设置</a>';
                if ($res['data']['wr_id'] != $wr_id) return LibFc::ReturnData(false, $errorMsg);
            }
        }
        if(mb_strlen($data['wr_encodingaeskey'])>43) return LibFc::ReturnData(false, 'encodingaeskey长度不符合');

        if($wr_id){
            $oldRes = $this->get('wx_robot',['*'],sprintf(" AND wr_id=%d",$wr_id),true);
            $oldDataArr = $oldRes['data'];
            $oldDataArr['wr_selfmod'] = $oldDataArr['wr_selfmod']?explode(',',$oldDataArr['wr_selfmod']):[];
        
            foreach ($oldDataArr as $key => $val) {
                if(!isset($data[$key])) {
                    $data[$key] = $val;
                } 
            }
        }

        $this->B2CDb->Begin();
        $dataArr  = [
            'wr_status' => (int)$data['wr_status'],
            'wr_uid' => (int)$data['wr_uid'],
            'wr_type' => $data['wr_type'],
            'wr_totype' => $data['wr_totype'],
            'wr_wxname' => $data['wr_wxname'],
            'wr_wxnum' => $data['wr_wxnum'],
            'wr_token' => $data['wr_token'],
            'wr_encodingaeskey' => $data['wr_encodingaeskey'],
            'wr_btime' => (int)$data['wr_btime'],
            'wr_etime' => (int)$data['wr_etime'],
            'wr_remark' => $data['wr_remark'],
            'wr_autotxt' => $data['wr_autotxt'],
            'wr_room_max' => (int)$data['wr_room_max'],
            'wr_wx_max' => (int)$data['wr_wx_max'],
            'wr_vin_fileds' => !empty($data['wr_vin_fileds']) ? implode(',', $data['wr_vin_fileds']) : '',
            'wr_name' => $data['wr_name'] ?: '',
            'wr_hasrestxt' => $data['wr_hasrestxt'] ?: '',
            'wr_engine' => (int)$data['wr_engine'],
            'wr_maxitem' => (int)$data['wr_maxitem'],
            'wr_ignoretxt' => empty($data['wr_ignoretxt']) ? '' : implode(',', array_filter(preg_split("/[\s,;，；]+/", $data['wr_ignoretxt']))),
            'wr_wrt_id' => (int)$data['wr_wrt_id'],
            'wr_number'=>(int)$data['wr_number'],
            'wr_othcof' => !empty($data['wr_othcof']) ? implode(',', $data['wr_othcof']) : '',
            // 'wr_sales'=> isset($data['wr_sales']) ?$data['wr_sales']:'',
            'wr_selfmod' => !empty($data['wr_selfmod']) ? implode(',', $data['wr_selfmod']) : '',
            'wr_mel_id' => isset($data['wr_mel_id'])?$data['wr_mel_id']:-1,
            'wr_othdata'=> $data['wr_othdata'] ?:'{}',
            'wr_au_uid'=> $data['wr_au_uid']?:0,
            'wr_roomcof'=>$data['wr_roomcof']?:'{}'
        ];
		if(!empty($wr_id))
		{
			$this->set('wx_robot', $dataArr, sprintf(" and wr_id=%d", $wr_id));
		}
		else
		{
			$res = $this->add('wx_robot', $dataArr);
			$dataArr['wr_id'] = $res['data'];
			$wr_id = $dataArr['wr_id'];
		}

        $tokenData = [];
        if(isset($data['wrt_sleeptime']))
        {
            $tokenData['wrt_sleeptime'] = $data['wrt_sleeptime']?:'#@Null';
        }
        if($tokenData) $this->set('wx_robot_token',$tokenData,sprintf(" and wrt_id=%d",(int)$data['wr_wrt_id']));
        

        $tokeninfo =  $this->get('wx_robot_token',['wrt_type'],sprintf(" and wrt_id = %d",$data['wr_wrt_id']),true);
        $wrttype = $tokeninfo['data']['wrt_type']??'wx';
        if($data['wr_type'] == 'wxgr' && in_array($wrttype,['wx','wxwork'])||$data['wr_type'] == 'wxkf')
        {   
            $where = sprintf(" and wrw_wr_id = %d",(int)$wr_id);
            $robotWxList = $this->get('wx_robot_wx',['*'],$where);
            $oldArr = $robotWxList? array_column($robotWxList['data'],'wrw_wx'):[];
            //中文逗号、分号、换行、逗号或空格(包含" ", \r, \t, \n, \f)
            $postArr = array_unique(array_filter(preg_split("/[\s,;，；]+/", $data['wrw_wx'])));
            if(count($postArr)>$data['wr_wx_max']){
                $errorMsg = "绑定的微信号超出最大限制";
                return LibFc::ReturnData(false,$errorMsg);
            }
           
            if(!empty($postArr)){

                //是否有重复:绑定的微信号判断规则：token + 微信号
                $where = sprintf(" and wrw_wx in ('%s') and wr_wrt_id=%d and wr_id!=%d",implode("','",$postArr),$dataArr['wr_wrt_id'],$wr_id);
                $table = 'wx_robot left join wx_robot_wx as wrw on wrw_wr_id = wr_id';
                $res =  $this->get($table,['wrw_wr_id','wrw_wx'],$where);
                if(count($res['data'])>0)
                {   
                    $errorMsg = '微信号：'.implode(',',array_column($res['data'],'wrw_wx'))."已配置机器人，不可重复设置";
                    return LibFc::ReturnData(false,$errorMsg);
                }
            }
            $delArr = array_diff($oldArr,$postArr);
            $newArr = array_diff($postArr,$oldArr);

            if (!empty($delArr)) {
                foreach ($delArr as $item) {
                    $where = sprintf(" and wrw_wr_id =%d and wrw_wx ='%s'", $wr_id, LibFc::Escape($item));
                    $this->del('wx_robot_wx', $where);
                }
            }
            //新增的
            if (!empty($newArr)) {
                //是否有重复
                $addData = [];
                foreach ($newArr as $v) {
                    $arr = [
                        'wrw_wr_id' => $wr_id,
                        'wrw_wx' => $v
                    ];
                    $addData[] = $arr;
                }
                if (!empty($addData)) {
                    $this->addAny('wx_robot_wx', ['wrw_wr_id', 'wrw_wx'], $addData);
                }
            }
        }
		$this->B2CDb->End();
        return LibFc::ReturnData(true, $wr_id);
    }

    /**
     * @param  $wr_id [int] 机器人ID
     * @method 删除机器人
     * @author zhengweihua 
     * @copyright 2022-07-15
     */
    public function delWxRobot($wr_id)
    {
        if(empty($wr_id)) return LibFc::ReturnData(false, '参数错误');
        $this->B2CDb->Begin();

        $wr_id = (int)$wr_id;
        $res = $this->get('wx_robot', ['wr_id'], sprintf(" and wr_id=%d ",$wr_id), true);
        if(empty($res['data'])) return LibFc::ReturnData(false, '参数错误');

        //删除机器人
        $delRobot = sprintf(" and wr_id = %d",$wr_id);
        $this->del('wx_robot',$delRobot);
        //删除自动回复消息
        $where  = sprintf(" and wra_wr_id = %d",$wr_id);
        $autoList =  $this->get('wx_robot_auto',['wra_id'],$where);
        if(!empty($autoList['data']))
        {   
            $delautoword = sprintf(' and waw_wra_id in (%s)',implode(',',array_column($autoList['data'],'wra_id')));
            $this->del('wx_robot_autoword',$delautoword);
            $this->del('wx_robot_auto',$where);
        }
        //删除消息
        $delMsg = sprintf(" and wrm_wr_id = %d",$wr_id);
        $this->del('wx_robot_msg',$delMsg);
        //删除群聊
        $delRoom = sprintf(" and wrr_wr_id = %d",$wr_id);
        $this->del('wx_robot_room',$delRoom);
        //删除绑定的微信号
        $delWx = sprintf(" and wrw_wr_id = %d",$wr_id);
        $this->del('wx_robot_wx',$delWx);
        $this->B2CDb->End();
        return LibFc::ReturnData(true);
    }
    /**
     * @param  $uid [int] 当前机器人用户id
     * @param  $exclude Array 排除的机器人tokenid
     * @method 获取机器人Token列表 [早期版本的机器人Token]
     * @author zhengweihua 
     * @copyright 2022-08-02 
     */
    public function getWxRobotTokenList($uid,$exclude = [])
    {
        //已使用的wrt_id
        $where =" and wr_wrt_id > 0 ";
        if($uid){
            //特殊处理"佳先"
            $where .= in_array($uid,[408916,820514])? " and wr_uid not in (408916,820514)":sprintf(" and wr_uid != %d",$uid);
        }
        $robotList =  $this->get('wx_robot',['wr_wrt_id'],$where);
        $wrtArr = array_unique(array_column($robotList['data'],'wr_wrt_id'));
        //排除掉指定的token
        if($exclude){
            $wrtArr = array_diff($wrtArr,$exclude);
        }
        $where = '';
        if(!empty($wrtArr)){
            $where = sprintf(" and wrt_id not in (%s) or wrt_uid = %d",implode(',',$wrtArr),0);
        }
		$where .= " order by wrt_seq asc";
		$wrtList = $this->get('wx_robot_token',['*'],$where);

        foreach ($wrtList['data'] as $key => &$item) {
            //中机昌盛[wxid_j57yvsfmy7yn22][独享]
            $item['name'] = $item['wrt_wxnickname'];
            $item['name'] .= $item['wrt_uid']? "[独享]": "[共享]";
            $item['name'] .=  $item['wrt_type']=='wxwork'?"[企业]":"";
            $item['name'] .=  $item['wrt_server'];
        }
        unset($item);
        return LibFc::ReturnData(true, $wrtList['data']);
    }

    public function setVerifyCode($wr_id,$verifycode)
    {   
        if(empty($wr_id) || empty($verifycode)) return LibFc::ReturnData(false, '参数错误');
        $res = $this->get('wx_robot',['wr_wrt_id'],sprintf(" and wr_id=%d",$wr_id),true);
        if($res['data'])
        {
            $wrt_id = $res['data']['wr_wrt_id'];
            $res = $this->set('wx_robot_token',['wrt_verifycode'=>$verifycode],sprintf(" AND wrt_id=%d",$wrt_id));
			$http = new LibHttp(false,false);
			$http->timeout = 2;
			$http->fetch('http://hub.paojd.cn:75/wechatEy/checkLogin?wrt_id='.$wrt_id);
            return LibFc::ReturnData(true,$res['data']);
        }
        return LibFc::ReturnData(false,'参数错误'); 
    }

    /**
     * @method
     * @author zhengweihua 
     * @copyright 2025-06-10
     */
    public function getWxRobotTokenListV2($wr_id=0)
    {   
        //当前机器人已使用的wrt_id
        if($wr_id){
            $res = $this->get('wx_robot',['wr_wrt_id'],sprintf(" and wr_id=%d",$wr_id),true);
            $bindWrtId = $res['data']['wr_wrt_id']??0;
            $sql = sprintf("select distinct wr_wrt_id from wx_robot where wr_id = %d",$wr_id);
        }
        //排除已使用的
        $sql = 'select distinct wr_wrt_id from wx_robot where wr_wrt_id>0';
        //wrt_isshare =1;
        $where = sprintf(" AND (wrt_isshare=1 OR wrt_id NOT IN (%s) OR wrt_id=%d)",$sql,$bindWrtId);
        $wrtList = $this->get('wx_robot_token',['*'],$where);

        foreach ($wrtList['data'] as $key => &$item) {
            //中机昌盛[wxid_j57yvsfmy7yn22][独享]
            $item['name'] = $item['wrt_wxnickname'];
            $item['name'] .= $item['wrt_isshare']? "[共享]": "[独享]";
            $item['name'] .=  $item['wrt_type']=='wxwork'?"[企业]":"";
            $item['name'] .=  $item['wrt_server'];
        }
        unset($item);
        return LibFc::ReturnData(true, $wrtList['data']);
    }

    public function getAllTokenList()
    {
        $sql =sprintf("select distinct wr_wrt_id from wx_robot where wr_wrt_id > 0 ");
        

        $where = sprintf(" AND wrt_id IN (%s) order by wrt_seq asc",$sql);
        
		$wrtList = $this->get('wx_robot_token',['*'],$where);

        foreach ($wrtList['data'] as $key => &$item) {
            //中机昌盛[wxid_j57yvsfmy7yn22][独享]
            $item['name'] = $item['wrt_wxnickname'];
            $item['name'] .= $item['wrt_isshare']? "[共享]": "[独享]";
            $item['name'] .=  $item['wrt_type']=='wxwork'?"[企业]":"";
            $item['name'] .=  $item['wrt_server'];
        }
        unset($item);
        return LibFc::ReturnData(true, $wrtList['data']);
    }

    /**
     * @param  Array $wrr_room_id
     * @param  int $wr_id
     * @method 变更群聊房间状态
     * @author zhengweihua 
     * @copyright 2025-07-08
     */
    public function changeRobotRoomStatus($wrr_room_id,$wr_id)
    {      
        if(empty($wr_id) || empty($wrr_room_id)) return LibFc::ReturnData(false, '参数错误');
        if(!is_array($wrr_room_id)){
            $wrr_room_id = [$wrr_room_id];
        }
        $this->B2CDb->Begin();

        // 获取符合条件的记录
        $res = $this->get(
            'wx_robot_room',
            ['*'],
            sprintf(" AND wrr_wr_id=%d AND wrr_room_id IN ('%s')", $wr_id, implode("','", $wrr_room_id))
        );

        if (!empty($res['data'])) {
            // 提取所有 wrr_room_id 和 wrr_id
            $roomIds = array_column($res['data'], 'wrr_room_id');
            $wrrIds = array_column($res['data'], 'wrr_id');

            // 批量更新 wrr_status 为 1
            $this->set(
                'wx_robot_room',
                ['wrr_status' => 1],
                sprintf(" AND wrr_id IN (%s)", implode(',', $wrrIds))
            );

            // 查询所有 wrr_room_id 不属于当前 wr_id 的记录
            $temp = $this->get(
                'wx_robot_room',
                ['wrr_id'],
                sprintf(" AND wrr_wr_id != %d AND wrr_room_id IN ('%s')", $wr_id, implode("','", $roomIds))
            );

            if (!empty($temp['data'])) {
                // 批量更新 wrr_status 为 -1
                $this->set(
                    'wx_robot_room',
                    ['wrr_status' => -1],
                    sprintf(" AND wrr_id IN (%s)", implode(',', array_column($temp['data'], 'wrr_id')))
                );
            }
        }
                $this->B2CDb->End();
        return LibFc::ReturnData(true, []);
    }
    

}
