<?php
/**
 * Created by PhpStorm.
 * User: dognwenzhang <772009936@qq.com>
 * Date: 2020/02/16   下午13：29
 */


namespace app\admin\model\wechat;

use app\admin\model\user\User;
use think\facade\Cache;
use crmeb\traits\ModelTrait;
use crmeb\basic\BaseModel;
use app\admin\model\wechat\WechatUser as UserModel;

/**
 * 微信用户行为记录  model
 * Class WechatMessage
 * @package app\admin\model\wechat
 */
class WechatMessage extends BaseModel
{

    /**
     * 数据表主键
     * @var string
     */
    protected $pk = 'id';

    /**
     * 模型名称
     * @var string
     */
    protected $name = 'wechat_message';

    use ModelTrait;

    protected $insert = ['add_time'];

    /**
     * 微信用户操作的基本所有操作
     * @var array
     */
    public static $mold = array(
        'event_subscribe'=>'关注微信号',
        'event_unsubscribe'=>'取消关注微信号',
        'event_scan'=>'扫码',
        'event_templatesendjobfinish'=>'进入小程序',
        'event_location'=>'获取位置',
        'event_click'=>'点击微信菜单关键字',
        'event_view'=>'点击微信菜单链接',
        'event_view_miniprogram'=>'点击微信菜单进入小程序',
        'text'=>'收到文本消息',
        'image'=>'收到图片消息',
        'video'=>'收到视频消息',
        'voice'=>'收到声音消息',
        'location'=>'收到位置消息',
        'link'=>'收到链接消息',
        'event_scan_subscribe'=>'扫码关注'
    );

    public static function setAddTimeAttr($value)
    {
        return time();
    }
    public static function setMessage($result,$openid,$type)
    {
        if(is_object($result) || is_array($result)) $result = json_encode($result);
        $add_time = time();
        $data = compact('result','openid','type','add_time');
        return self::create($data);
    }

    public static function setOnceMessage($result,$openid,$type,$unique,$cacheTime = 172800)
    {
        $cacheName = 'wechat_message_'.$type.'_'.$unique;
        if(Cache::has($cacheName)) return true;
        $res = self::setMessage($result,$openid,$type);
        if($res) Cache::set($cacheName,1,$cacheTime);
        return $res;
    }

    /**
     * 按钮事件
     * @param $Event
     * @return mixed
     */
    public static function tidyEvent($Event){
        $res = array(
          'msg'=>$Event['EventKey'],
        );
       return $res;
    }
    /**
     * 取消关注事件扫码
     * @param $Event
     * @return mixed
     */
    public static function tidyNull(){
        $res = array(
            'msg'=>'无',
        );
       return $res;
    }
    /**
     * 整理文本显示的数据
     * @param $text 收到的文本消息
     * return 返回收到的消息
     */
    public static function tidyText($text){
        $res = array(
            'rep_id'=> '1',
            'MsgId'=>$text['MsgId'],
            'Content'=>$text['Content'],
            'msg'=>$text['Content'],
        );
        return $res;
    }
    /**
     * 整理图片显示的数据
     * @param $image
     * @return mixed
     */
    public static function tidyImage($image){
        $res = array(
            'rep_id'=> '2',
            'MsgId'=>$image['MsgId'],
            'PicUrl'=>$image['PicUrl'],
            'MediaId'=>$image['MediaId'],
            'msg'=>'媒体ID：'.$image['MediaId'],
        );
        return $res;
    }
    /**
     * 整理视屏显示的数据
     * @param $video
     * @return mixed
     */
    public static function tidyVideo($video){
        $res = array(
            'rep_id'=> '3',
            'MsgId'=>$video['MsgId'],
            'MediaId'=>$video['MediaId'],
            'msg'=>'媒体ID：'.$video['MediaId'],
        );
        return $res;
    }
    /**
     * 整理声音显示的数据
     * @param $voice
     * @return mixed
     */
    public static function tidyVoice($voice){
        $res = array(
            'rep_id'=> '4',
            'MsgId'=>$voice['MsgId'],
            'MediaId'=>$voice['MediaId'],
            'msg'=>'媒体ID：'.$voice['MediaId'],
        );
        return $res;
    }
    /**
     * 地理位置
     * @param $location
     * @return array
     */
    public static function tidyLocation($location){
          $res = array(
              'rep_id'=> '5',
              'MsgId'=>$location['MsgId'],
              'Label'=>$location['Label'],
              'msg'=>$location['Label'],
          );
          return $res;
    }
    /**
     * 获取用户扫码点击事件
     * @param array $where
     * @return array
     */
    public static function systemPage($where = array()){
        $model = new self;
        $model = $model->alias('m');
        if($where['nickname'] !== ''){
            $user = UserModel::where('nickname','LIKE',"%$where[nickname]%")->field('openid')->select();
            if(empty($user->toArray())) $model = $model->where('m.id',0);
            foreach ($user as $v){
                $model = $model->where('m.openid',$v['openid']);
            }
        }
        if($where['type'] !== '') $model = $model->where('m.type',$where['type']);
        if($where['data'] !== ''){
            list($startTime,$endTime) = explode(' - ',$where['data']);
            $model = $model->where('m.add_time','>',strtotime($startTime));
            $model = $model->where('m.add_time','<',strtotime($endTime));
        }
        $model = $model->field('u.nickname,m.*')->join('WechatUser u','u.openid=m.openid')->order('m.id desc');
        return self::page($model,function ($item){
         switch ($item['type']){
            case 'text': $item['result_arr'] = self::tidyText(json_decode($item['result'],true));break;
            case 'image': $item['result_arr'] = self::tidyImage(json_decode($item['result'],true));break;
            case 'video': $item['result_arr'] = self::tidyVideo(json_decode($item['result'],true));break;
            case 'voice': $item['result_arr'] = self::tidyVoice(json_decode($item['result'],true));break;
            case 'location': $item['result_arr'] = self::tidyLocation(json_decode($item['result'],true));break;
            case 'event_click': $item['result_arr'] = self::tidyEvent(json_decode($item['result'],true));break;
            case 'event_view': $item['result_arr'] = self::tidyEvent(json_decode($item['result'],true));break;
            case 'event_subscribe': $item['result_arr'] = self::tidyNull();break;
            case 'event_unsubscribe': $item['result_arr'] = self::tidyNull();break;
            case 'event_scan': $item['result_arr'] = self::tidyNull();break;
            default :$item['result_arr'] = ['msg'=>$item['type']];break;
         }
        $item['type_name'] = isset(self::$mold[$item['type']]) ? self::$mold[$item['type']] : '未知';
        },$where);
    }

    /*
    * 获取应为记录数据
     *
     */
    public static function getViweList($date,$class=[]){
        $model=new self();
        switch ($date){
            case null:case 'today':case 'week':case 'year':
            if($date==null) $date='month';
            $model=$model->whereTime('add_time',$date);
            break;
            case 'quarter':
                $time=User::getMonth('n');
                $model=$model->where('add_time','between', $time);
                break;
            default:
                list($startTime,$endTime)=explode('-',$date);
                $model = $model->where('add_time','>',strtotime($startTime));
                $model = $model->where('add_time','<',strtotime($endTime));
                break;
        }
        $list=$model->field(['type','count(*) as num','result'])->group('type')->limit(0,20)->select()->toArray();
        $viwe=[];
        foreach ($list as $key=>$item){
            $now_list['name']=isset(self::$mold[$item['type']]) ? self::$mold[$item['type']] : '未知';
            $now_list['value']=$item['num'];
            $now_list['class']=isset($class[$key])?$class[$key]:'';
            $viwe[]=$now_list;
        }
        return $viwe;
    }
}