<?php

declare(strict_types=1);

require_once __DIR__ . '/vendor/autoload.php';

$app = new Core\Application(__DIR__);

$command = $argv[1] ?? 'help';

switch ($command) {
    case 'queue:process':
        $svc = new App\Services\NotificationService();
        $result = $svc->processEmailQueue(10);
        echo "Processed: {$result['processed']} sent, {$result['failed']} failed.\n";
        break;

    case 'queue:retry':
        $svc = new App\Services\NotificationService();
        $count = $svc->retryFailed();
        echo "{$count} failed emails reset to pending.\n";
        break;

    case 'queue:stats':
        $svc = new App\Services\NotificationService();
        $stats = $svc->getQueueStats();
        echo "Pending: {$stats['pending']}\nSent: {$stats['sent']}\nFailed: {$stats['failed']}\n";
        break;

    case 'queue:purge':
        $days = (int) ($argv[2] ?? 30);
        $svc = new App\Services\NotificationService();
        $svc->purgeOld($days);
        echo "Purged records older than {$days} days.\n";
        break;

    case 'doi:register-pending':
        $svc = new App\Services\DOIService();
        $pending = $svc->getPendingRegistration();
        $count = 0;
        foreach ($pending as $record) {
            if ($svc->register((int) $record->article_id)) {
                $count++;
                echo "Registered: {$record->doi}\n";
            } else {
                echo "Failed: {$record->doi}\n";
            }
        }
        echo "Registered {$count} of " . count($pending) . " pending DOIs.\n";
        break;

    case 'doi:generate':
        $articleId = (int) ($argv[2] ?? 0);
        if (!$articleId) { echo "Usage: php ajca doi:generate <article_id>\n"; exit(1); }
        $svc = new App\Services\DOIService();
        $doi = $svc->generate($articleId);
        echo "Generated DOI: {$doi}\n";
        break;

    case 'storage:purge':
        $svc = new App\Services\RetentionService();
        $result = $svc->purge();
        if (!empty($result['skipped'])) {
            echo "Storage retention is disabled. Enable it in Admin > Storage & Backup.\n";
        } else {
            echo "Purged {$result['files_deleted']} file(s), freed " . number_format($result['bytes_freed']) . " bytes across {$result['articles_affected']} article(s).\n";
        }
        break;

    case 'storage:status':
        $svc = new App\Services\RetentionService();
        $config = $svc->getConfig();
        $stats = $svc->storageStats();
        echo "Retention: " . ($config['enabled'] ? "enabled ({$config['months']} months)" : 'disabled') . "\n";
        echo "Last run: " . ($config['last_run'] ?? 'never') . "\n";
        echo "Uploads size: " . number_format($stats['uploads_bytes']) . " bytes\n";
        echo "Published files: {$stats['published_files']}\n";
        echo "Files expiring now: {$stats['expiring_files']}\n";
        break;

    case 'backup:run':
        $svc = new App\Services\BackupService();
        $includeUploads = strtolower($argv[2] ?? 'yes') !== 'no';
        $result = $svc->create($includeUploads);
        $svc->cleanup();
        echo "Backup created: {$result['filename']} (" . number_format($result['size']) . " bytes).\n";
        break;

    case 'backup:list':
        $svc = new App\Services\BackupService();
        $backups = $svc->list();
        if (empty($backups)) {
            echo "No backups yet.\n";
        }
        foreach ($backups as $b) {
            echo "{$b['name']}  " . date('Y-m-d H:i:s', $b['created_at']) . "  " . number_format($b['size']) . " bytes\n";
        }
        break;

    case 'backup:cleanup':
        $keep = (int) ($argv[2] ?? 5);
        $svc = new App\Services\BackupService();
        $removed = $svc->cleanup($keep);
        echo "Removed {$removed} old backup(s).\n";
        break;

    case 'help':
    default:
        echo "AJCA CLI Commands:\n";
        echo "  queue:process        Process pending email queue\n";
        echo "  queue:retry          Reset failed emails to pending\n";
        echo "  queue:stats          Show email queue statistics\n";
        echo "  queue:purge [days]   Purge old queue records (default: 30)\n";
        echo "  doi:register-pending Register all pending DOIs\n";
        echo "  doi:generate <id>    Generate a DOI for an article\n";
        echo "  storage:purge        Delete published files older than the retention period\n";
        echo "  storage:status       Show retention config and storage usage\n";
        echo "  backup:run [yes|no]  Create a backup zip (uploads included unless 'no')\n";
        echo "  backup:list          List saved backup archives\n";
        echo "  backup:cleanup [n]   Keep the newest n backups, delete the rest (default: 5)\n";
        break;
}
