<?php
namespace App\Model;

use Jenssegers\Mongodb\Eloquent\Model as Moloquent;

class NodesModel extends Moloquent{    
    protected $connection = 'mongodb';  //库名    
    protected $collection = 'cron_nodes';     //文档名    
    protected $primaryKey = '_id';    //设置id    
    protected $guarded = ['_id'];  //设置字段黑名单
    public $timestamps = false;

    // 获取所有节点
    public function getlists($request)
    {
    	$page  = $request->input('page', 1);
        $limit = $request->input('limit', 10);

        $map['node_ip']    = $request->input('node_ip', ''); // 节点IP
        $map['status']     = $request->input('status', 0);
        $map['begin_time'] = $request->input('begin_time', '') ? strtotime($request->input('begin_time')) : '';
        $map['end_time']   = $request->input('end_time', '') ? strtotime($request->input('end_time')) + 86399 : '';

        $list = $this->where(function($query) use($map) {
        			if ($map['node_ip']) {
        				$query->where('node_ip', 'like', '%'.$map['node_ip'].'%');
        			}

        			if ($map['status']) {
        				$query->where('status', '=', intval($map['status']));
        			}

        			// 创建时间
                    if(!empty($map['begin_time']) && !empty($map['end_time'])) {  
                        $query->whereBetween('create_time', [$map['begin_time'], $map['end_time']]);
                    } else if(!empty($map['begin_time'])) {
                        $query->where('create_time', '>=', $map['begin_time']);
                    } else if(!empty($map['end_time'])) {
                        $query->where('create_time', '<=', $map['end_time']);
                    }
        		})
                ->orderBy('create_time', 'desc')
        		->orderBy('_id', 'desc')
        		->paginate(intval($limit), ['*'], 'page', $page)
                ->toArray();

    	$data = $this->handleData($list['data']);

    	return ['code'=>0, 'msg'=>'获取成功', 'data'=>$data, 'count'=>$list['total']];
    }

    // 处理数据
    public function handleData($data)
    {
        if (empty($data)) return $data;

        foreach ($data as $k=>&$v) {
            $v['create_time'] = date('Y-m-d H:i:s', $v['create_time']);
            $v['update_time'] = $v['update_time'] ? date('Y-m-d H:i:s', $v['update_time']) : '';
        }

        return $data;
    }

    // 获取节点,同时同步到mongo
    public function getNodes()
    {
        $url = Config('website.go_server').'worker/list';

        $res = json_decode(curlApi($url), true);

        if (!$res || $res['errno'] != 0) return ['errcode' => 1, 'errmsg' => '节点获取失败'];

        if (!$res['data']) return ['errcode' => 1, 'errmsg' => '未获取到节点信息'];

        $exists_node = $this->lists('node_ip')->toArray(); // 已存在的节点

        foreach ($res['data'] as $v) {
            if (in_array($v, $exists_node)) { // 存在则更新
                $this->where('node_ip', $v)->update(['update_time' => time()]);
            } else { // 不存在则新增
                $this->insert([
                    'node_ip'     => $v,
                    'status'      => 1,
                    'create_time' => time(),
                    'update_time' => time(),
                ]);
            }
        }
       
        $diff = array_diff($exists_node, $res['data']); // 求差集,获取掉线节点

        if (!$diff) return ['errcode' => 0, 'errmsg' => '获取节点成功,无掉线节点'];
            
        foreach ($diff as $val) {
            $this->where('node_ip', $val)->update(['status' => -1, 'update_time' => time()]);
        }     

        return ['errcode' => 0, 'errmsg' => '获取节点成功'];
    }


}