<?php

namespace App\Listeners;

use Illuminate\Auth\Events\Authenticated;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;
use App\Services\Common\PmsService;

/**
 * Class SendSysMessage
 * 用户登录后补发系统消息
 * @package App\Listeners
 * Auth Zhong
 * Date 2018/12/24
 */
class SendSysMessage implements ShouldQueue
{
    use InteractsWithQueue,Queueable;
    protected $pmsService;


    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct(PmsService $pmsService)
    {
        $this->queue = "sys_message";
        $this->pmsService = $pmsService;
    }

    /**
     * Handle the event.
     *
     * @param  Authenticated  $event
     * @return void
     */
    public function handle(Authenticated $event)
    {
        //Log::info("用户认证成功", $event->user->toArray());
        //获取系统消息表sys_message中
        $user = $event->user;
        if (array_has($user, 'utype')) {
            $user_cratetime = $user->created_at;
            $subsite_id = $user->subsite_id;

            $where = '(user_type = 0 OR user_type = '.$user->utype.') and ((news_type = 1 and created_at >= "'.$user_cratetime.'") or (news_type = 2 and ended_at >= '.strtotime($user_cratetime).'))';
            $new_sys = $this->pmsService->getNewestSysMessage($where, $subsite_id);
            if ($new_sys) {
                //添加系统站内信/添加弹窗消息(老用户和在显示时间范围内的新用户)
                $sys_time = strtotime($new_sys->created_at);

                //获取pms表中最新添加的消息
                $pms_where = array(
                    'utype'     => $user->utype,
                    'msgtouid'  => $user->id,
                    'msgfromuid'=> 0
                );
                $pms = $this->pmsService->getNewestPms($pms_where);
                $origin_time = 0;
                $time = 0;
                $time1 = 0;
                if ($pms) {
                    $time = strtotime($pms->created_at);
                    $time1 = $pms->created_at;
                    $origin_time = $time1;
                }
                if ($time< strtotime($user_cratetime)) {
                    $time = strtotime($user_cratetime);
                    $time1 = $user_cratetime;
                }
                if ((($time < $sys_time) && ($new_sys->news_type == 1))|| ($new_sys->news_type == 2) && ($time < $sys_time || $time1<$new_sys->ended_at)) {
                    //获取符合条件的系统消息并添加到pms表中
                    /*$sys_where = array(
                        array('created_at','>', $time1)
                    );
                    $whereIn['user_type'] = [0,$user->utype];
                    $sys_lists = $this->pmsService->getSysMessages($sys_where, $whereIn, $subsite_id);*/
                    $filter_sys = 'user_type in (0,'.$user->utype.') and ((news_type =1 and created_at > "'.$time1.'") or (news_type = 2 and (created_at > "'.$origin_time.'" and ended_at> '.$time.')))';
                    $sys_lists = $this->pmsService->getFilterMessages($filter_sys, $subsite_id);
                    if ($sys_lists->toArray()) {
                        //处理数据
                        $insert_data = array();
                        $time = date('Y-m-d H:i:s', time());
                        foreach ($sys_lists as $key => $val) {
                            $insert_data[$key] = array(
                                'utype'      => $user->utype,
                                'msgtype'    => $val->news_type,
                                'msgfromuid' => 0,
                                'msgfrom'     => 'admin',
                                'msgtoname'   => $user->username,
                                'msgtouid'    => $user->id,
                                'message'     => $val->content,
                                'started_at'  => strtotime($val->started_at)>0?strtotime($val->started_at):0,
                                'ended_at'    => strtotime($val->ended_at)>0?strtotime($val->ended_at):0,
                                'new'          => 1,
                                'created_at'  => $val->created_at,
                                'updated_at'  => date('Y-m-d H:i:s', time())
                            );
                        }
                        $rst = $this->pmsService->addBatchPms($insert_data);
                    }
                }
            }
        }
    }
}