<?php

declare(strict_types=1);

use App\Admin\DeploymentReadinessChecklist;
use App\Admin\ProductionLaunchGate;
use App\Application\EnvironmentConfig;

$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/Delivery/HttpDeliveryProviderPolicy.php';
    require_once $root . '/src/Media/MediaStorageReadinessPolicy.php';
    require_once $root . '/src/Admin/DeploymentReadinessChecklist.php';
    require_once $root . '/src/Admin/ProductionLaunchGate.php';
}

$allowWarnings = in_array('--allow-warnings', array_slice($argv ?? [], 1), true);
$config = EnvironmentConfig::fromFile($root . '/.env');

try {
    $publicHtaccess = $root . '/public/.htaccess';
    $publicReviewPagesPresent = is_file($root . '/public/mvp-showcase.html') || is_file($root . '/public/mvp-profiles.html');
    $checks = (new DeploymentReadinessChecklist())->evaluate([
        'APP_ENV' => (string) $config->get('APP_ENV', 'dev'),
        'APP_DEBUG' => (string) $config->get('APP_DEBUG', 'false'),
        'APP_LAUNCH_PROFILE' => (string) $config->get('APP_LAUNCH_PROFILE', 'ticket-selling-v1'),
        'COOKIE_SECRET' => (string) $config->get('COOKIE_SECRET', ''),
        'QR_SIGNING_SECRET' => (string) $config->get('QR_SIGNING_SECRET', ''),
        'STRIPE_SECRET_KEY' => (string) $config->get('STRIPE_SECRET_KEY', ''),
        'STRIPE_WEBHOOK_SECRET' => (string) $config->get('STRIPE_WEBHOOK_SECRET', ''),
        'PAYMENT_MOCK_ENABLED' => (string) $config->get('PAYMENT_MOCK_ENABLED', 'false'),
        'MVP_RUNTIME_SCHEMA_REPAIR' => (string) $config->get('MVP_RUNTIME_SCHEMA_REPAIR', ''),
        'FINANCE_EXPORT_MAIL_PROVIDER' => (string) $config->get('FINANCE_EXPORT_MAIL_PROVIDER', 'log'),
        'FINANCE_EXPORT_MAIL_HTTP_ENDPOINT' => (string) $config->get('FINANCE_EXPORT_MAIL_HTTP_ENDPOINT', ''),
        'FINANCE_EXPORT_MAIL_HTTP_BEARER_TOKEN' => (string) $config->get('FINANCE_EXPORT_MAIL_HTTP_BEARER_TOKEN', ''),
        'SMS_OTP_PROVIDER' => (string) $config->get('SMS_OTP_PROVIDER', 'log'),
        'SMS_OTP_SIGNING_SECRET' => (string) $config->get('SMS_OTP_SIGNING_SECRET', ''),
        'SMS_OTP_HTTP_ENDPOINT' => (string) $config->get('SMS_OTP_HTTP_ENDPOINT', ''),
        'SMS_OTP_HTTP_BEARER_TOKEN' => (string) $config->get('SMS_OTP_HTTP_BEARER_TOKEN', ''),
        'ALERT_NOTIFICATION_PROVIDER' => (string) $config->get('ALERT_NOTIFICATION_PROVIDER', 'log'),
        'ALERT_NOTIFICATION_HTTP_ENDPOINT' => (string) $config->get('ALERT_NOTIFICATION_HTTP_ENDPOINT', ''),
        'ALERT_NOTIFICATION_HTTP_BEARER_TOKEN' => (string) $config->get('ALERT_NOTIFICATION_HTTP_BEARER_TOKEN', ''),
        'TICKET_DELIVERY_PROVIDER' => (string) $config->get('TICKET_DELIVERY_PROVIDER', 'log'),
        'TICKET_DELIVERY_HTTP_ENDPOINT' => (string) $config->get('TICKET_DELIVERY_HTTP_ENDPOINT', ''),
        'TICKET_DELIVERY_HTTP_BEARER_TOKEN' => (string) $config->get('TICKET_DELIVERY_HTTP_BEARER_TOKEN', ''),
        'MEDIA_MALWARE_SCAN_REQUIRED' => (string) $config->get('MEDIA_MALWARE_SCAN_REQUIRED', ''),
        'CLAMAV_CLAMSCAN_PATH' => (string) $config->get('CLAMAV_CLAMSCAN_PATH', ''),
        'MEDIA_STORAGE_DRIVER' => (string) $config->get('MEDIA_STORAGE_DRIVER', 'local_public'),
        'MEDIA_PUBLIC_BASE_URL' => (string) $config->get('MEDIA_PUBLIC_BASE_URL', ''),
        'PUBLIC_REVIEW_PAGES_PRESENT' => $publicReviewPagesPresent ? 'true' : 'false',
    ], is_file($root . '/public/uploads/.htaccess'), is_file($publicHtaccess) && str_contains((string) file_get_contents($publicHtaccess), 'Content-Security-Policy'), extension_loaded('gd'));

    $gate = (new ProductionLaunchGate())->evaluate($checks, !$allowWarnings);
    echo json_encode([
        ...$gate,
        'checks' => $checks,
        'ran_at' => date('c'),
    ], JSON_PRETTY_PRINT) . PHP_EOL;

    exit($gate['status'] === 'ready' ? 0 : 1);
} catch (Throwable $exception) {
    fwrite(STDERR, json_encode([
        'status' => 'error',
        'message' => $exception->getMessage(),
        'ran_at' => date('c'),
    ], JSON_PRETTY_PRINT) . PHP_EOL);
    exit(1);
}
