<?php

declare(strict_types=1);

use App\Application\EnvironmentConfig;
use App\Payment\StripeReadinessChecklist;

$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/Payment/StripeReadinessChecklist.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', '');

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

    $hasConnectedAccount = stripe_readiness_has_connected_account($pdo);
    $sdkAvailable = class_exists(\Stripe\StripeClient::class) || class_exists(\Stripe\Checkout\Session::class);
    $result = (new StripeReadinessChecklist())->evaluate([
        'STRIPE_MODE' => (string) $config->get('STRIPE_MODE', 'test'),
        'STRIPE_SECRET_KEY' => (string) $config->get('STRIPE_SECRET_KEY', ''),
        'STRIPE_PUBLISHABLE_KEY' => (string) $config->get('STRIPE_PUBLISHABLE_KEY', ''),
        'STRIPE_WEBHOOK_SECRET' => (string) $config->get('STRIPE_WEBHOOK_SECRET', ''),
        'STRIPE_CONNECT_CHARGE_MODEL' => (string) $config->get('STRIPE_CONNECT_CHARGE_MODEL', 'destination_charge'),
    ], $sdkAvailable, $hasConnectedAccount);

    echo json_encode([
        ...$result,
        'connected_account_ready' => $hasConnectedAccount,
        'ran_at' => date(DATE_ATOM),
    ], JSON_PRETTY_PRINT) . PHP_EOL;

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

function stripe_readiness_has_connected_account(PDO $pdo): bool
{
    try {
        $stmt = $pdo->query(
            "SELECT COUNT(*)
             FROM stripe_connected_accounts
             WHERE onboarding_status = 'complete'
               AND charges_enabled = 1
               AND payouts_enabled = 1
               AND stripe_account_id <> ''"
        );

        return (int) $stmt->fetchColumn() > 0;
    } catch (Throwable) {
        return false;
    }
}
