<?php

namespace App\Console\Commands;

use App\Models\BackupLog;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;

class BackupDatabase extends Command
{
    protected $signature = 'catalog:backup {--retentie=18250 : Zile de retenție (default 50 ani)}';
    protected $description = 'Backup bazei de date SQLite conform politicii GDPR și MEN (retenție 50 ani pentru registrul matricol)';

    public function handle(): int
    {
        $dbPath = database_path('database.sqlite');

        if (!file_exists($dbPath)) {
            $this->error('Baza de date SQLite nu a fost găsită.');
            return self::FAILURE;
        }

        $backupDir = storage_path('app/backups');
        if (!is_dir($backupDir)) {
            mkdir($backupDir, 0755, true);
        }

        $timestamp = now()->format('Y-m-d_H-i-s');
        $filename = "catalog-backup-{$timestamp}.sqlite";
        $backupPath = "{$backupDir}/{$filename}";

        $this->info("Se creează backup: {$filename}...");

        if (!copy($dbPath, $backupPath)) {
            $this->error('Eroare la copierea bazei de date.');
            BackupLog::create([
                'tip' => 'automat',
                'fisier' => $filename,
                'dimensiune' => 0,
                'status' => 'eroare',
                'detalii' => 'Eroare la copierea fișierului',
                'creat_la' => now(),
            ]);
            return self::FAILURE;
        }

        $size = filesize($backupPath);
        $retentieZile = (int) $this->option('retentie');
        $expiraLa = now()->addDays($retentieZile);

        BackupLog::create([
            'tip' => 'automat',
            'fisier' => $filename,
            'dimensiune' => $size,
            'status' => 'succes',
            'detalii' => "Backup complet, retenție {$retentieZile} zile",
            'creat_la' => now(),
            'expira_la' => $expiraLa,
        ]);

        $this->info("Backup creat cu succes: {$filename} (" . number_format($size / 1024, 1) . " KB)");
        $this->info("Retenție: {$retentieZile} zile (expiră: {$expiraLa->format('d.m.Y')})");

        $this->cleanOldBackups($backupDir, $retentieZile);

        return self::SUCCESS;
    }

    protected function cleanOldBackups(string $dir, int $retentieZile): void
    {
        $expiredLogs = BackupLog::where('status', 'succes')
            ->where('expira_la', '<', now())
            ->get();

        foreach ($expiredLogs as $log) {
            $path = "{$dir}/{$log->fisier}";
            if (file_exists($path)) {
                unlink($path);
                $this->info("Backup expirat șters: {$log->fisier}");
            }
            $log->update(['status' => 'expirat', 'detalii' => $log->detalii . ' | Șters automat']);
        }

        $keepMin = 5;
        $totalBackups = BackupLog::where('status', 'succes')->count();
        if ($totalBackups <= $keepMin) {
            return;
        }
    }
}
