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

namespace app\admin\model\system;

use crmeb\traits\ModelTrait;
use crmeb\basic\BaseModel;
use think\facade\Db;

/**
 * 后台通知model
 * Class SystemNotice
 * @package app\admin\model\system
 */
class SystemNotice extends BaseModel
{
    /**
     * 数据表主键
     * @var string
     */
    protected $pk = 'id';

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

    use ModelTrait;

    protected function setResultAttr($value)
    {
        return json_encode($value);
    }

    protected function setTableTitleAttr($value)
    {
        $list = [];
        if(!empty($value)){
            $group = explode(',',$value);
            $list = array_map(function($v){
                list($title,$key) = explode('-',$v);
                return compact('title','key');
            },$group);
        }
        return json_encode($list);
    }

    protected function getTableTitleAttr($value)
    {
        return json_decode($value,true);
    }

    protected function getResultAttr($value)
    {
        return json_decode($value,true);
    }

    protected function setPushAdminAttr($value)
    {
        $value = is_array($value) ? array_unique(array_filter($value)) : [];
        return implode(',',$value);
    }

    protected function getPushAdminAttr($value)
    {
        return array_filter(explode(',',$value));
    }

    public static function typeByAdminList($type,$field = 'id')
    {
        return self::where('type',$type)->field($field)->find();
    }

    public static function systemNoticeAdminDb()
    {
        return Db::name('SystemNoticeAdmin');
    }

    public static function adminMessage($notice_type,$admin_id,$link_id,array $table_data = [])
    {
        $table_data = json_encode($table_data);
        $add_time = time();
        return self::systemNoticeAdminDb()->insert(compact('notice_type','admin_id','link_id','table_data','add_time'));
    }

    public static function noticeMessage($noticeType,$linkId,array $tableData = [])
    {
        $noticeInfo = self::get(['type'=>$noticeType]);
        if(!$noticeInfo) return self::setErrorInfo('通知模板消息不存在!');
        $adminIds = array_merge(array_map(function($v){
            return $v['id'];
        },SystemAdmin::getTopAdmin('id')->toArray())?:[],self::typeByAdminList($noticeType,'push_admin')->push_admin?:[]);
        $adminIds = array_unique(array_filter($adminIds));
        if(!count($adminIds)) return self::setErrorInfo('没有有效的通知用户!');
        foreach ($adminIds as $id){
            self::adminMessage($noticeType,$id,$linkId,$tableData);
        }
        return true;
    }

    public static function getAdminNoticeTotal($adminId)
    {
        $list = self::alias('A')->join('__SYSTEM_NOTICE_ADMIN__ B','B.notice_type = A.type')
            ->where('A.status',1)->where('B.is_visit',0)->where('B.is_click',0)->where('B.admin_id',$adminId)
            ->field('count(B.id) total')->group('A.id')->select()->toArray();
        if(!$list) return 0;
        return array_reduce($list,function($initial,$res){
            return $initial+$res['total'];
        },0);
    }

    public static function getAdminNotice($adminId)
    {
        $list = self::alias('A')->join('__SYSTEM_NOTICE_ADMIN__ B','B.notice_type = A.type')
            ->where('A.status',1)->where('B.is_visit',0)->where('B.is_click',0)->where('B.admin_id',$adminId)
            ->field('A.id,A.type,A.title,A.icon,count(B.id) total,A.template,max(B.add_time) as last_time')
            ->group('A.id')->having('total > 0')->select()->toArray();
        $noticeTypeList = [];
        array_walk($list,function(&$notice) use(&$noticeTypeList){
            $notice['message'] = sprintf($notice['template'],$notice['total']);
            $noticeTypeList[] = $notice['type'];
        });
        if(count($noticeTypeList))
            self::systemNoticeAdminDb()->where('notice_type','IN',$noticeTypeList)->where('admin_id',$adminId)
                ->update(['is_visit'=>1,'visit_time'=>time()]);
        return $list;
    }

}