<?php

namespace App\Http\Controllers;

use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;
use Symfony\Component\HttpFoundation\StreamedResponse;

class BackupController extends Controller
{
    public function index(): View
    {
        $disco = Storage::disk(config('backup.backup.destination.disks')[0] ?? 'local');
        $carpeta = config('backup.backup.name');

        $archivos = collect($disco->exists($carpeta) ? $disco->files($carpeta) : [])
            ->filter(fn ($ruta) => str_ends_with($ruta, '.zip'))
            ->map(fn ($ruta) => [
                'nombre' => basename($ruta),
                'tamano_mb' => round($disco->size($ruta) / 1024 / 1024, 2),
                'fecha' => Carbon::createFromTimestamp($disco->lastModified($ruta)),
            ])
            ->sortByDesc('fecha')
            ->values();

        return view('backup.index', compact('archivos'));
    }

    public function generar(): RedirectResponse
    {
        Artisan::call('backup:run', ['--only-db' => true]);

        return redirect()->route('backup.index')->with('status', 'Backup de la base de datos generado correctamente.');
    }

    public function descargar(string $archivo): StreamedResponse
    {
        $disco = Storage::disk(config('backup.backup.destination.disks')[0] ?? 'local');
        $carpeta = config('backup.backup.name');

        // basename() elimina cualquier intento de path traversal (../, rutas absolutas).
        $nombre = basename($archivo);
        $ruta = $carpeta.'/'.$nombre;

        abort_unless(str_ends_with($nombre, '.zip') && $disco->exists($ruta), 404);

        return $disco->download($ruta);
    }
}
