<?php


namespace App\Libs\Push\XMPush;


/**
 * 文档地址：https://dev.mi.com/console/doc/detail?pId=1783
 * Class MiPushCommon
 * @package App\Libs\Push\XMPush
 */
class MiPushCommon
{
    private $_reg_arr = [];

    /**
     * XMPushCommon constructor.
     * @param $package
     * @param $appSecret
     */
    public function __construct($package, $appSecret)
    {
        // 常量设置必须在new Sender()方法之前调用
        Constants::setPackage($package);
        Constants::setSecret($appSecret);
    }

    public function setRegArr($regArr)
    {
        $this->_reg_arr = $regArr;
    }

    /**
     * 发送消息
     * @param $title
     * @param $desc
     * @param $url  // 参考 /views/Reader?send_order_id=1643289&bid=vdqY7p15xnZQzK4VzzgmMD6wG2yr8BNX&chapter_id=4774851
     * @return mixed
     */
    public function sendMessage($title, $desc, $url)
    {
        $sender  = new Sender();
        $message = $this->buildMessage($title, $desc, $url);
        $result  = $sender->sendHybridMessageByRegId($message, $this->_reg_arr)->getRaw();

        $this->logPush(__FUNCTION__, 'result', compact('result'));
        return $result;
    }

    /**
     * 向所有设备发送消息
     * @param $title
     * @param $desc
     * @param $url
     * @return mixed
     */
    public function sendMessageToAll($title, $desc, $url)
    {
        $sender  = new Sender();
        $message = $this->buildMessage($title, $desc, $url);
        $result  = $sender->broadcastAll($message)->getRaw();

        $this->logPush(__FUNCTION__, 'result', compact('result'));
        return $result;
    }

    /**
     * @param        $title
     * @param        $desc
     * @param        $url
     * @param int    $pusType
     * @param string $payload
     * @return Builder
     */
    private function buildMessage($title, $desc, $url, $pusType = 0, $payload = '')
    {
        $message = new Builder();
        $message->title($title);  // 通知栏的title
        $message->description($desc); // 通知栏的descption
        $message->passThrough($pusType);  // 这是一条通知栏消息，如果需要透传，把这个参数设置成1,同时去掉title和descption两个参数
        $message->notifyType(1);
        $message->extra(Builder::HYBRID_PATH, $url); // 此处设置预定义点击行为，1为打开app
//        $message->extra(Builder::notifyEffect, 2); // 此处设置预定义点击行为，1为打开app 2通知栏点击后打开app的任一Activity
//        $message->extra(Builder::notifyForeground, 1); // 应用在前台是否展示通知，如果不希望应用在前台时候弹出通知，则设置这个参数为0
        $message->extra(Builder::flowControl, 3000); // 设置平滑推送, 推送速度3000每秒(qps=3000)
        $message->notifyId(2); // 通知类型。最多支持0-4 5个取值范围，同样的类型的通知会互相覆盖，不同类型可以在通知栏并存
        $message->build();
        return $message;
    }

    /**
     * @param       $className
     * @param       $message
     * @param array $data
     */
    private function logPush($className, $message, $data = [])
    {
        var_dump('[' . $className . '] ' . $message, $data);
        myLog('push')->info('[XiaoMi] [' . $className . '] ' . $message, $data);
    }
}