#!/usr/bin/env php
<?php
declare(strict_types=1);
/**
 * PurrCore — CLI / Artisan
 * Uso:
 *   php artisan backup:run        — backup completo
 *   php artisan backup:db         — solo base de datos
 *   php artisan backup:files      — solo archivos
 *   php artisan backup:cleanup    — eliminar backups antiguos
 *   php artisan newsletter:send {id} — enviar campaña
 */

define('ROOT_PATH', __DIR__);
define('APP_PATH',  ROOT_PATH . '/app');
define('STORAGE_PATH', ROOT_PATH . '/storage');

require_once ROOT_PATH . '/vendor/autoload.php';
require_once APP_PATH  . '/Helpers/functions.php';

$dotenv = Dotenv\Dotenv::createImmutable(ROOT_PATH);
$dotenv->load();

$_ENV += getenv();

$command = $argv[1] ?? '';
$arg     = $argv[2] ?? '';

function writeln(string $msg, string $color = ''): void
{
    $colors = ['green' => "\033[32m", 'red' => "\033[31m", 'yellow' => "\033[33m", 'cyan' => "\033[36m"];
    $reset  = "\033[0m";
    $prefix = $colors[$color] ?? '';
    echo $prefix . '[' . date('H:i:s') . '] ' . $msg . $reset . "\n";
}

match ($command) {

    'backup:run' => (function () {
        writeln('Iniciando backup completo...', 'cyan');
        $svc = new \Services\BackupService();
        $res = $svc->runFull();
        foreach ($res as $type => $r) {
            if ($r['success']) {
                writeln("✅ {$type}: " . basename($r['path']) . " (" . round($r['size'] / 1048576, 1) . " MB)", 'green');
            } else {
                writeln("❌ {$type}: " . ($r['error'] ?? 'Error desconocido'), 'red');
                exit(1);
            }
        }
        writeln('Backup completado.', 'green');
    })(),

    'backup:db' => (function () {
        writeln('Backup de base de datos...', 'cyan');
        $res = (new \Services\BackupService())->backupDatabase();
        if ($res['success']) writeln("✅ " . basename($res['path']), 'green');
        else { writeln("❌ " . $res['error'], 'red'); exit(1); }
    })(),

    'backup:files' => (function () {
        writeln('Backup de archivos...', 'cyan');
        $res = (new \Services\BackupService())->backupFiles();
        if ($res['success']) writeln("✅ " . basename($res['path']), 'green');
        else { writeln("❌ " . $res['error'], 'red'); exit(1); }
    })(),

    'backup:cleanup' => (function () use ($arg) {
        $days = $arg ? (int)$arg : 30;
        writeln("Limpiando backups de más de {$days} días...", 'yellow');
        (new \Services\BackupService())->cleanup($days);
        writeln('Limpieza completada.', 'green');
    })(),

    'newsletter:send' => (function () use ($arg) {
        if (!$arg) { writeln('Uso: php artisan newsletter:send {id}', 'red'); exit(1); }
        writeln("Enviando campaña #{$arg}...", 'cyan');
        $res = (new \Services\NewsletterService())->sendCampaign((int)$arg);
        if ($res['success']) {
            writeln("✅ Enviados: {$res['sent']}, Fallidos: {$res['failed']}", 'green');
        } else {
            writeln("❌ " . ($res['error'] ?? 'Error'), 'red'); exit(1);
        }
    })(),

    default => (function () {
        echo "\n  \033[36mPurrCore Artisan\033[0m\n\n";
        echo "  \033[33mComandos disponibles:\033[0m\n";
        echo "    backup:run           Backup completo (BD + archivos)\n";
        echo "    backup:db            Solo base de datos\n";
        echo "    backup:files         Solo archivos subidos\n";
        echo "    backup:cleanup [días] Eliminar backups antiguos (default: 30)\n";
        echo "    newsletter:send {id} Enviar campaña de newsletter\n\n";
        echo "  \033[33mEjemplo cron para backup diario a las 3am:\033[0m\n";
        echo "    0 3 * * * /usr/bin/php " . ROOT_PATH . "/artisan backup:run >> /var/log/purrcore_backup.log 2>&1\n\n";
    })(),
};
