<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/6/12 0012
 * Time: 16:38
 */
namespace app\modules\third\push;

use app\modules\common\Helper;
use app\modules\sys\log\ImLog;
use JPush\Client as JPush;
use JPush\Exceptions\JPushException;
use Yii;
use JPush\Exceptions\APIConnectionException;
use JPush\Exceptions\APIRequestException;
use yii\base\Exception;

class Push
{

    //const   APP_KEY='f12938d2794d3c5b05c035ab';
    //const   SECRET='3bbba8bda2f826d0946385be';
    /*获取配置*/
    private static function getPushConfig($app_type = 'tech'){
        $array = [
            'tech'=>[
                'APP_KEY'=>'be6f2f97bf1fc4a6f51b2e86',
                'SECRET'=>'217e0b028cc6ee30bd75c7f6',
            ],
            'shop'=>[
                'APP_KEY'=>'f12938d2794d3c5b05c035ab',
                'SECRET'=>'3bbba8bda2f826d0946385be', 
            ]
        ];
        return isset($array[$app_type])?$array[$app_type]:[];
    }
    /*发送推送*/
    public static function postPush($data)
    {
        $connect = Yii::$app->db;
        $cmd = $connect->createCommand('select * from {{%users_jpush}} where user_id=:uid');
        $cmd->bindValue(':uid', $data['user_id']);
        $result = $cmd->queryOne();
        if (!empty($result)) {
            $push_data = [
                'user_id' => $result['user_id'],
                'content' => $data['content'],
                'reg_id' => $result['registration'],
                'source' => $result['source'],
                'order' => 1,
                'type' => isset($data['type'])?$data['type']:'',
                'type_id' => isset($data['type_id'])?$data['type_id']:0,
                'app_type'=>$result['type']
            ];
            Push::addPush($push_data);
        }
    }
    /*添加推送*/
    public static function addPush($data = array())
    {
        if (empty($data['user_id'])) {
            return false;
        }
        if (empty($data['content'])) {
            return false;
        }
        if (empty($data['reg_id'])) {
            return false;
        }
        if (strlen($data['content'])>=900) {
            return false;
        }
        if (YII_ENV_PROD || YII_ENV_DEV) {
            $status=0;//默认状态未发送
            if ($data['order']==1) {
                $mes['type']=$data['type'];
                $mes['app_type']=$data['app_type'];
                $mes['content']=$data['content'];
                $mes['reg_id']=$data['reg_id'];
                if (isset($data['extra']) && !empty($data['extra'])) {
                    $mes['extra'] = $data['extra'];
                } else {
                    $mes['extra'] = [
                        'type' =>  $mes['type'],
                    ];
                }
                if ($data['source']==2) {
                    $result=self::androidPush($mes);
                    if ($result) {
                        $status=1;
                    } else {
                        $status=2;
                    }
                } elseif ($data['source']==1) {
                    $result=self::iosPush($mes);
                    if ($result) {
                        $status=1;
                    } else {
                        $status=2;
                    }
                }
            }
        } else {
            $status = 1;
        }
        ImLog::instance()->Log(['data' => $data, 'status' => $status]);
        /*$connection=Yii::$app->db;
        $transaction = $connection->beginTransaction();
        try {
            $connection->createCommand()->insert('{{%message}}', [
                    'user_id' => $data['user_id'],
                    'type' => $data['type_id'],
                    'status' =>0,
                    'send_status' =>$status,
                    'content' => $data['content'],
                    'addtime' => time(),
                    'addip' => Helper::getUserIp(),
                ])->execute();

            $connection->createCommand()->insert('{{%jpush_queue}}', [
                    'user_id' => $data['user_id'],
                    'reg_id' => $data['reg_id'],
                    'status' =>$status,
                    'type' => $data['type'],
                    'content' => $data['content'],
                    'addtime' => time(),
                    'source'=>$data['source']
                ])->execute();
            $transaction->commit();
        } catch (Exception $e) {
            $transaction->rollBack();
        }*/
        return $status;
    }

    //android 推送通知
    public static function androidPush($data)
    {
        $app_type = isset($data['app_type'])?$data['app_type']:'';
        if(empty($app_type)) return false;
        $push_config = self::getPushConfig($app_type);
        $client=new JPush($push_config['APP_KEY'], $push_config['SECRET']);
        try {
            $response = $client->push()
                ->setPlatform('android');
            if (isset($data['reg_id'])){
                $response->addRegistrationId($data['reg_id']);
            }

            $response->androidNotification($data['content'], array(
                    'title' => '精誉美车家',
                    'build_id' => 0,
                    'extras' => $data['extra'],
                ))
                ->options(array(
                    'apns_production' => true,
                ))
                ->send();
            return $response;
        } catch (APIConnectionException $e) {
            return false;
        } catch (APIRequestException $e) {
            return false;
        }
    }
    //ios 推送通知
    public static function iosPush($data)
    {
        $app_type = isset($data['app_type'])?$data['app_type']:'';
        if(empty($app_type)) return false;
        $push_config = self::getPushConfig($app_type);
        $client=new JPush($push_config['APP_KEY'], $push_config['SECRET']);
        try {
            $response = $client->push()
                ->setPlatform('ios');
                if (isset($data['reg_id'])){
                    $response->addRegistrationId($data['reg_id']);
                }
                $response->iosNotification($data['content'], array(
                    'sound' => 'sound.caf',
                    'badge' => '+1',
                    'content-available' => true,
                    'extras' => $data['extra'],
                ))
                ->options(array(
                    'apns_production' => true,
                ))
                ->send();
            return $response;
        } catch (APIConnectionException $e) {
            return false;
        } catch (APIRequestException $e) {
            return false;
        }
    }
    //安卓的不分正式和测试
    public static function pushAll($data)
    {
        $app_type = isset($data['app_type'])?$data['app_type']:'';
        if(empty($app_type)) return false;
        $push_config = self::getPushConfig($app_type);
        $client=new JPush($push_config['APP_KEY'], $push_config['SECRET']);
        try {
            if ($data['target'] == 1) {
                $response = $client->push()
                    ->setPlatform('android')
                    ->setAudience('all')
                    ->androidNotification($data['content'], array(
                        'title' => '精誉美车家',
                        'build_id' => 0,
                        'extras' => $data['extra'],
                    ))
                    ->options(array(
                        'apns_production' => true,
                        'big_push_duration' => 12
                    ))
                    ->send();
            } elseif ($data['target'] == 2) {
                $response = $client->push()
                    ->setPlatform('ios')
                    ->setAudience('all')
                    ->iosNotification($data['content'], array(
                        'sound' => 'sound.caf',
                        'badge' => '+1',
                        'content-available' => true,
                        'extras' => $data['extra'],
                    ))
                    ->options(array(
                        'apns_production' => true,
                        'big_push_duration' => 12
                    ))
                    ->send();
            } else {
                $response = $client->push()
                    ->setPlatform('all')
                    ->setAudience('all')
                    ->iosNotification($data['content'], array(
                        'sound' => 'sound.caf',
                        'badge' => '+1',
                        'content-available' => true,
                        'extras' => $data['extra'],
                    ))
                    ->androidNotification($data['content'], array(
                        'title' => '精誉美车家',
                        'build_id' => 0,
                        'extras' => $data['extra'],
                    ))
                    ->options(array(
                        'apns_production' => true,
                        'big_push_duration' => 12
                    ))
                    ->send();
            }
            return $response;
        } catch (JPushException $e) {
//            return $e;
            return false;
        } catch (APIConnectionException $e) {
            return false;
        } catch (APIRequestException $e) {
            return false;
        }
    }

    //多用户推送
    public static function pushMultiple($data)
    {
        $app_type = isset($data['app_type'])?$data['app_type']:'';
        if(empty($app_type)) return false;
        $push_config = self::getPushConfig($app_type);
        $client=new JPush($push_config['APP_KEY'], $push_config['SECRET']);
        try {
                $response = $client->push()
                    ->setPlatform('all')
                    ->addRegistrationId($data['register'])
                    ->iosNotification($data['content'], array(
                        'sound' => 'sound.caf',
                        'badge' => '+1',
                        'content-available' => true,
                        'extras' => $data['extra'],
                    ))
                    ->androidNotification($data['content'], array(
                        'title' => '精誉美车家',
                        'build_id' => 0,
                        'extras' => $data['extra'],
                    ))
                    ->options(array(
                        'apns_production' => true,
                    ))
                    ->send();

            return $response;
        } catch (JPushException $e) {
//            return $e;
            return false;
        } catch (APIConnectionException $e) {
            return false;
        } catch (APIRequestException $e) {
            return false;
        }
    }
}
