<?php

namespace app\common\library;

use getusersig\getusersig;
use tencentim\tencentim;

class Tenim
{

    /**
     * 发送消息给某人-接口调用
     */
    public function sendToUser() {
        $from_user = '2';// 发送者
        $to_user = '294';// 接收者
        $message = 'hello许犇';// 接收者
        if(!$from_user || !$to_user || !$message) $this->error("参数缺失！");
        $this->sendMessageToUser($from_user,$to_user,$message);
    }


    /**
     * 发送消息给某人
     */
    //https://console.tim.qq.com/v4/openim/sendmsg?sdkappid=88888888&identifier=admin&usersig=xxx&random=99999999&contenttype=json
    public function sendMessageToUser($from_user,$to_user,$message) {

        $random = rand(10000000,99999999);
        $usersig = $this->usersig("administrator");
        // 获取配置信息
        $config = config("tencent_im");
        $url = "https://console.tim.qq.com/v4/openim/sendmsg";
        $url .= "?sdkappid=".$config["sdkappid"];
        $url .= "&identifier=administrator";
        $url .= "&usersig=".$usersig;
        $url .= "&random=".$random;
        $url .= "&contenttype=json";
        $tencentObj = new tencentim($url);

        $data = [];
        $data["SyncOtherMachine"] = 1;
        $data["From_Account"] = (string)$from_user;
        $data["To_Account"] = (string)$to_user;
        $data["MsgRandom"] = rand(1000000,9999999);
        $data["MsgTimeStamp"] = time();

        $data["MsgBody"][] = [
            "MsgType" => "TIMTextElem",
            "MsgContent" => [
                "Text"=> $message
            ],
        ];
        $res = $tencentObj->toSend($data);

        if (empty($res['ActionStatus']) || $res['ActionStatus'] != 'OK') {
            $error = !empty($res['ErrorInfo']) ? 'im error:'.$res['ErrorInfo'] : 'im error';
            return $error;
        }

        return true;

    }

    /**
     * 发送自定义消息给某人
     */
    public function sendCustomMessageToUser($from_user,$to_user,$message) {

        $random = rand(10000000,99999999);
        $usersig = $this->usersig("administrator");
        // 获取配置信息
        $config = config("tencent_im");
        $url = "https://console.tim.qq.com/v4/openim/sendmsg";
        $url .= "?sdkappid=".$config["sdkappid"];
        $url .= "&identifier=administrator";
        $url .= "&usersig=".$usersig;
        $url .= "&random=".$random;
        $url .= "&contenttype=json";
        $tencentObj = new tencentim($url);

        $data = [];
        $data["SyncOtherMachine"] = 1;//1=消息同步至发送方，2=消息不同步至发送方
        $data["From_Account"] = (string)$from_user;
        $data["To_Account"] = (string)$to_user;
        $data["MsgRandom"] = rand(1000000,9999999);
        $data["MsgTimeStamp"] = time();

        $data["MsgBody"][] = [
            "MsgType" => "TIMCustomElem",
            "MsgContent" => [
                "Data" => json_encode($message),
                "Desc" => $message['name'],
                "Ext"  => $message['name'],
                "Sound"=> '',
            ],
        ];
        $data['CloudCustomData'] = $message['id'];
        $res = $tencentObj->toSend($data);

        if (empty($res['ActionStatus']) || $res['ActionStatus'] != 'OK') {
            $error = !empty($res['ErrorInfo']) ? 'im error:'.$res['ErrorInfo'] : 'im error';
            return $error;
        }

        return true;

    }

    //注册用户到im
    public function register($userid,$nickname,$avatar) {

        $random = rand(10000000,99999999);
        $usersig = $this->usersig("administrator");
        //dump($usersig);
        // 获取配置信息
        $config = config("tencent_im");
        $url = "https://console.tim.qq.com/v4/im_open_login_svc/account_import";
        $url .= "?sdkappid=".$config["sdkappid"];
        $url .= "&identifier=administrator";
        $url .= "&usersig=".$usersig;
        $url .= "&random=".$random;
        $url .= "&contenttype=json";
        $tencentObj = new tencentim($url);

        $data = [
            'UserID' => $userid,
            'Nick'  => $nickname,
            'FaceUrl' => $avatar,
        ];

        $res = $tencentObj->toSend($data);

        if (empty($res['ActionStatus']) || $res['ActionStatus'] != 'OK') {
            $error = !empty($res['ErrorInfo']) ? 'im error:'.$res['ErrorInfo'] : 'im error';
            return $error;
        }

        return true;
    }

    //某个用户是否im在线
    //https://cloud.tencent.com/document/product/269/2566
    /*  QueryResult.Status
    返回的用户状态，目前支持的状态有：
    前台运行状态（Online）：客户端登录后和即时通信 IM 后台有长连接
    后台运行状态（PushOnline）：iOS 和 Android 进程被 kill 或因网络问题掉线，进入 PushOnline 状态，此时仍然可以接收消息的离线推送。客户端切到后台，但是进程未被手机操作系统 kill 掉时，此时状态仍是 Online
    未登录状态（Offline）：客户端主动退出登录或者客户端自上一次登录起7天之内未登录过
    如果用户是多终端登录，则只要有一个终端的状态是 Online ，该字段值就是 Online
    */
    public function is_online($userid){
        $random = rand(10000000,99999999);
        $usersig = $this->usersig("administrator");
        //dump($usersig);
        // 获取配置信息
        $config = config("tencent_im");
        $url = "https://console.tim.qq.com/v4/openim/query_online_status";
        $url .= "?sdkappid=".$config["sdkappid"];
        $url .= "&identifier=administrator";
        $url .= "&usersig=".$usersig;
        $url .= "&random=".$random;
        $url .= "&contenttype=json";
        $tencentObj = new tencentim($url);

        $data = [
            'To_Account' => [$userid],
        ];

        $res = $tencentObj->toSend($data);

        if (!empty($res['ActionStatus']) && $res['ActionStatus'] == 'OK') {
            if(    isset($res['QueryResult'][0]['To_Account'])
                && isset($res['QueryResult'][0]['Status'])
                && $res['QueryResult'][0]['To_Account'] == $userid
                && $res['QueryResult'][0]['Status'] == 'Online'){
                return true;
            }
        }

        return false;
    }


    /**
     * IM添加好友
     */
    public function friend_add($From_Account,$To_Account){
        $random = rand(10000000,99999999);
        $usersig = $this->usersig("administrator");
        // 获取配置信息
        $config = config("tencent_im");
        $url = "https://console.tim.qq.com/v4/sns/friend_add";
        $url .= "?sdkappid=".$config["sdkappid"];
        $url .= "&identifier=administrator";
        $url .= "&usersig=".$usersig;
        $url .= "&random=".$random;
        $url .= "&contenttype=json";
        $tencentObj = new tencentim($url);

        $data = [
            'From_Account' => $From_Account,
            'AddFriendItem' => [
                [
                    'To_Account' => $To_Account,
                    'AddSource' => 'AddSource_Type_APP',

                ],
            ],
            'AddType' => 'Add_Type_Both',
            'ForceAddFlags' => 1,
        ];

        $res = $tencentObj->toSend($data);

        if (isset($res['ActionStatus']) && $res['ActionStatus'] == 'OK') {
            if(    isset($res['ResultItem'][0]['ResultCode'])
                && isset($res['ResultItem'][0]['To_Account'])
                && $res['QueryResult'][0]['ResultCode'] == 0
                && $res['QueryResult'][0]['To_Account'] == $To_Account){
                return true;
            }
        }

        return false;
    }


    /**
     * IM删除好友
     */
    public function friend_del($From_Account,$To_Account){
        $random = rand(10000000,99999999);
        $usersig = $this->usersig("administrator");
        // 获取配置信息
        $config = config("tencent_im");
        $url = "https://console.tim.qq.com/v4/sns/friend_delete";
        $url .= "?sdkappid=".$config["sdkappid"];
        $url .= "&identifier=administrator";
        $url .= "&usersig=".$usersig;
        $url .= "&random=".$random;
        $url .= "&contenttype=json";
        $tencentObj = new tencentim($url);

        $data = [
            'From_Account' => $From_Account,
            'To_Account' => [
                $To_Account,
            ],
            'DeleteType' => 'Delete_Type_Both',
        ];

        $res = $tencentObj->toSend($data);

        if (isset($res['ActionStatus']) && $res['ActionStatus'] == 'OK') {
            if(    isset($res['ResultItem'][0]['ResultCode'])
                && isset($res['ResultItem'][0]['To_Account'])
                && $res['QueryResult'][0]['ResultCode'] == 0
                && $res['QueryResult'][0]['To_Account'] == $To_Account){
                return true;
            }
        }

        return false;
    }


    /**
     * 获取usersig签名-具体操作
     */
    public function usersig($user_id) {
        // 获取配置信息
        $config = config("tencent_im");
        $usersigObj = new getusersig($config["sdkappid"],$config["key"]);
        $usersig = $usersigObj->genUserSig($user_id);
        return $usersig;
    }
}
