<?php

declare(strict_types=1);

use App\Application\EnvironmentConfig;
use App\Finance\FinanceExportDeliverySender;
use App\Finance\FinanceExportFileLocator;

$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/Finance/FinanceExportFileLocator.php';
    require_once $root . '/src/Finance/FinanceExportDeliverySender.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', '');
$limit = 25;

foreach (array_slice($argv ?? [], 1) as $arg) {
    if (str_starts_with((string) $arg, '--limit=')) {
        $limit = max(1, min(100, (int) substr((string) $arg, 8)));
    }
}

try {
    $pdo = new PDO((string) $dsn, (string) $user, (string) $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]);
    $sender = new FinanceExportDeliverySender($pdo, new FinanceExportFileLocator($root . '/runtime/finance-exports'));
    echo json_encode($sender->sendQueued([
        'APP_ENV' => (string) $config->get('APP_ENV', 'dev'),
        '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', ''),
    ], $limit), JSON_PRETTY_PRINT) . PHP_EOL;
    exit(0);
} catch (Throwable $exception) {
    fwrite(STDERR, json_encode(['status' => 'error', 'message' => $exception->getMessage(), 'ran_at' => date('c')], JSON_PRETTY_PRINT) . PHP_EOL);
    exit(1);
}
