#!/usr/bin/env php
<?php

declare(strict_types=1);

chdir(__DIR__ . '/..');

require 'vendor/autoload.php';
require 'config/config.php';
require 'lib/Support/helpers.php';
$container = require 'lib/App/registerContainer.php';
setAppContainer($container);

use MintyPHP\DB;
use MintyPHP\Http\RequestContext;
use MintyPHP\Service\Audit\SystemAuditService;
use MintyPHP\Service\Scheduler\SchedulerServicesFactory;

$exitCode = 0;
$startedAt = microtime(true);
try {
    RequestContext::start([
        'channel' => 'scheduler',
        'method' => 'CLI',
        'path' => 'bin/scheduler-run.php',
    ]);
    $factory = app(SchedulerServicesFactory::class);
    $result = $factory->createSchedulerRunService()->runDueJobs();
    if (!($result['ok'] ?? false)) {
        $error = (string) ($result['error'] ?? 'unexpected_error');
        fwrite(STDERR, sprintf("scheduler run failed: %s\n", $error));
        $exitCode = 1;
    } else {
        $line = sprintf(
            "scheduler completed: processed=%d success=%d failed=%d skipped=%d duration_ms=%d\n",
            (int) ($result['processed'] ?? 0),
            (int) ($result['success'] ?? 0),
            (int) ($result['failed'] ?? 0),
            (int) ($result['skipped'] ?? 0),
            (int) ($result['duration_ms'] ?? 0)
        );
        fwrite(STDOUT, $line);
    }
} catch (Throwable $exception) {
    try {
        app(SystemAuditService::class)->record('scheduler.run', 'failed', [
            'error_code' => 'unexpected_error',
            'metadata' => [
                'trigger_type' => 'scheduler',
                'run_status' => 'failed',
                'processed' => 0,
                'success_count' => 0,
                'failed_count' => 0,
                'skipped_count' => 0,
                'duration_ms' => max(0, (int) round((microtime(true) - $startedAt) * 1000)),
                'bootstrap_error' => true,
            ],
        ]);
    } catch (Throwable) {
        // fail-open
    }

    fwrite(STDERR, sprintf("scheduler run failed: unexpected_error: %s\n", $exception->getMessage()));
    $exitCode = 1;
} finally {
    DB::close();
}
exit($exitCode);
