<?php

declare(strict_types=1);

namespace Autogedal\FeedMonitor\Model\Adapter;

use Autogedal\FeedMonitor\Model\Clock;
use Autogedal\FeedMonitor\Model\Config;
use Autogedal\FeedMonitor\Model\FeedMonitor;
use Autogedal\FeedMonitor\Model\Heartbeat;
use Autogedal\FeedMonitor\Model\MonitorKey;
use Autogedal\FeedMonitor\Model\Problem;

/**
 * The Magento cron itself: when nothing in cron_schedule started or ended for too long, no job runs (feeds included).
 * Only meaningful outside cron:run, from the server crontab.
 */
class MagentoHeartbeatMonitor implements SourceMonitorInterface
{
    public function __construct(
        private readonly FeedMonitor $monitor,
        private readonly Heartbeat $heartbeat,
        private readonly Config $config,
        private readonly Clock $clock
    ) {
    }

    public function check(bool $outsideCron): array
    {
        if (!$outsideCron) {
            return [];
        }

        $last = $this->heartbeat->getLastActivity();
        $idle = $last === null ? null : $this->clock->now() - $last;
        if ($idle === null || $idle > $this->config->getHeartbeatMaxIdleMinutes() * 60) {
            $message = $last === null
                ? 'cron_schedule nu are niciun job executat.'
                : sprintf(
                    'Ultimul job din cron_schedule a pornit / s-a terminat la %s (UTC), acum %s.',
                    $this->clock->format($last),
                    $this->monitor->duration($idle)
                );
            $this->monitor->raise(MonitorKey::MAGENTO_CRON, Problem::CRON_DOWN, $message);

            return [MonitorKey::MAGENTO_CRON . ': ' . $message];
        }
        $this->monitor->clear(MonitorKey::MAGENTO_CRON, 'Cron-ul Magento ruleaza din nou.');

        return [];
    }
}
