<?php
namespace process;

use FilesystemIterator;
use Workerman\Timer;
use support\Db;
use support\Log;
use support\ApiTask;
use support\LibDb;

class TaskSendMail
{
    private $task;
    private $pdo;
    public function onWorkerStart()
    {
        set_time_limit(3600 * 100);
        ini_set('memory_limit', '2048M');
        
        $this->task = new ApiTask('TaskSendMail');
        // 每隔60秒检查一次
        // 执行一次大概15秒
        Timer::add(15, function(){
    		$data = $this->task->get();
    		if($data->enable 
    		   && time()>strtotime($data->begin_start_time) //开始时间
    		   && (empty($data->access_time) || time()-strtotime($data->access_time) > $data->interval)
    		){
                $nowTime = getNowTime();
                if($data->interval >= 86400){ //达到或超过1天时
                    $t = explode(' ',$data->begin_start_time); 
                    $jgTime = $t[1];
                    $t = explode(' ',getNowTime()); 
                    $date = $t[0];
                    $nowTime  = $date .' '. $jgTime;
                }
    			$this->task->begin($nowTime);
    			$this->execute($data->access_time,$nowTime);
                $this->task->complete(getNowTime());
    		}
        });
    }

    public function execute($beginTime,$endTime)
    {
         $row = Db::table('smt_task')
        ->join('smt_rules', 'smttask_sr_id', '=', 'sr_id')
        ->select(
                    'smttask_id','smttask_automail','smttask_issendmail'
        )
        ->where('smttask_state','=','done')
        ->where('smttask_issendmail','=',0)
        ->where('smttask_send_err_count','<',3)
        ->orderBy('smttask_isnow','desc')
        ->orderBy('smttask_rundate','asc')
        ->first();
        if(empty($row)) {
            return;
        }
        
        if($this->callSendMail($row->smttask_id)){
            Db::table('smt_task')
            ->where('smttask_id','=',$row->smttask_id)
            ->update(['smttask_issendmail'=>1]);
        }
    }

    public function callSendMail($task_id)
    {
        $apiUrl = config('app.sendMallApiUrl').'?task_id='.$task_id;
		$json = curl([
			'url'=>$apiUrl,
			'timeout'=>1200,
			'dataType'=>'get',
		]);
        if($json['status']){
            $res = json_decode($json['content'],true);
            if($res && $res['msg']){
                //错误信息
                $msg = substr($res['msg'],0,255);
                Db::table('smt_task')
                ->where('smttask_id','=',$task_id)
                ->update(['smttask_send_err_info' => $msg ]);
            }
            if($res && $res['state']){
                return true;
            }
		}
        //出错计数
        Db::table('smt_task')
        ->where('smttask_id','=',$task_id)
        ->increment('smttask_send_err_count');

        Log::channel('task_sendmail')->info('curl:'.json_encode($json,JSON_UNESCAPED_UNICODE));
        return false;
    }
        

}