<?php

declare(strict_types=1);

use App\Application\EnvironmentConfig;
use App\Media\MediaRetentionPlanner;
use App\Media\MediaRetentionPolicy;

$root = dirname(__DIR__);

if (file_exists($root . '/vendor/autoload.php')) {
    require_once $root . '/vendor/autoload.php';
} else {
    require_once $root . '/src/Application/EnvironmentConfig.php';
    require_once $root . '/src/Media/MediaRetentionPolicy.php';
    require_once $root . '/src/Media/MediaRetentionPlanner.php';
}

$config = EnvironmentConfig::fromFile($root . '/.env');
$dsn = $config->get('DB_DSN', 'mysql:host=127.0.0.1;port=3306;dbname=zavvion_events;charset=utf8mb4');
$user = $config->get('DB_USERNAME', 'root', ['DB_USER']);
$password = $config->get('DB_PASSWORD', '');
$archive = in_array('--archive', $argv ?? [], true);
$settings = [
    'orphan_grace_days' => 90,
    'unsafe_grace_days' => 7,
    'archived_review_days' => 365,
    'scan_batch_limit' => 100,
];

foreach ($argv ?? [] as $arg) {
    $arg = (string) $arg;
    foreach ([
        '--limit=' => 'scan_batch_limit',
        '--orphan-days=' => 'orphan_grace_days',
        '--unsafe-days=' => 'unsafe_grace_days',
        '--archived-days=' => 'archived_review_days',
    ] as $prefix => $key) {
        if (str_starts_with($arg, $prefix)) {
            $settings[$key] = (int) substr($arg, strlen($prefix));
        }
    }
}

try {
    $pdo = new PDO((string) $dsn, (string) $user, (string) $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]);

    $policy = MediaRetentionPolicy::fromArray($settings);
    $planner = new MediaRetentionPlanner($pdo);
    echo json_encode($planner->run($policy, $archive, $policy->scanBatchLimit), JSON_PRETTY_PRINT) . PHP_EOL;
    exit(0);
} catch (Throwable $exception) {
    $payload = [
        'status' => 'error',
        'message' => $exception->getMessage(),
        'ran_at' => date('c'),
    ];
    if ($config->truthy('APP_DEBUG')) {
        $payload['exception'] = get_class($exception);
    }

    fwrite(STDERR, json_encode($payload, JSON_PRETTY_PRINT) . PHP_EOL);
    exit(1);
}
