<?php

namespace App\Packages\Cron\Manager;

use App\Packages\Cron\Models\CronLog;
use App\Packages\Cron\Repository\CronLogRepository;
use Carbon\Carbon;
use Cron\CronExpression;

/**
 * Class CronLogManager
 * @package App\Packages\Cron\Manager
 */
class CronLogManager
{

    /**
     * @param \Illuminate\Console\Scheduling\Event[] $events
     */
    public static function processCommands($events)
    {
        foreach ($events as $event) {
            $expression = CronExpression::factory($event->expression);

            $info = [
                'command' => $event->command,
                'expression' => $event->expression,
                'next_execution' => $expression->getNextRunDate()
            ];

            $event->before(function () use ($info) {
                CronLogManager::log($info);
            });

            $event->after(function () use ($info) {
                CronLogManager::log($info);
            });
        }
    }

    /**
     * @param array $info
     */
    public static function log($info)
    {
        $exist_log = CronLogRepository::init()->getCommandStartedLatest($info);

        if (!$exist_log) {
            $log = new CronLog();
            $log->command = $info['command'];
            $log->expression = $info['expression'];
            $log->next_execution = $info['next_execution'];
            $log->start_at = Carbon::now();
            $log->start_execution = microtime(true) * 1000;
            $log->save();
        } else {
            $exist_log->end_at = Carbon::now();
            $exist_log->end_execution = microtime(true) * 1000;
            $exist_log->execution_time = number_format($exist_log->end_execution - $exist_log->start_execution, 0, '', '');
            $exist_log->save();
        }
    }

}