<?php

namespace App\Console\Commands;

use App\Services\BackupService;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class BackupDatabase extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'backup:database 
                            {--type=full : Tip backup (full sau incremental)}
                            {--no-db : Exclude baza de date}
                            {--no-files : Exclude fișierele}
                            {--encrypt : Criptează backup-ul}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Creează un backup al bazei de date și fișierelor';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $this->info('🚀 Începe procesul de backup...');
        
        $type = $this->option('type');
        $includeDatabase = !$this->option('no-db');
        $includeFiles = !$this->option('no-files');
        $encrypt = $this->option('encrypt');
        
        // Validare tip
        if (!in_array($type, ['full', 'incremental'])) {
            $this->error('❌ Tip backup invalid. Folosește: full sau incremental');
            return 1;
        }
        
        // Validare conținut
        if (!$includeDatabase && !$includeFiles) {
            $this->error('❌ Trebuie să incluzi cel puțin baza de date sau fișierele');
            return 1;
        }
        
        try {
            $backupService = new BackupService();
            
            $this->info("📦 Tip backup: {$type}");
            $this->info("💾 Include DB: " . ($includeDatabase ? 'Da' : 'Nu'));
            $this->info("📁 Include fișiere: " . ($includeFiles ? 'Da' : 'Nu'));
            $this->info("🔐 Criptat: " . ($encrypt ? 'Da' : 'Nu'));
            $this->newLine();
            
            $backup = $backupService->createBackup([
                'type' => $type,
                'include_database' => $includeDatabase,
                'include_files' => $includeFiles,
                'encrypt' => $encrypt,
                'created_by' => 1, // System user
            ]);
            
            $this->newLine();
            $this->info('✅ Backup creat cu succes!');
            $this->table(
                ['Proprietate', 'Valoare'],
                [
                    ['ID', $backup->id],
                    ['Tip', $backup->type],
                    ['Fișier', $backup->filename],
                    ['Dimensiune', $backup->file_size_human],
                    ['Durată', $backup->duration_human],
                    ['Tabele', $backup->tables_count ?? 'N/A'],
                    ['Înregistrări', $backup->records_count ?? 'N/A'],
                    ['Fișiere', $backup->files_count ?? 'N/A'],
                ]
            );
            
            if (!empty($backup->uploaded_to)) {
                $this->info("📤 Uploadat către " . count($backup->uploaded_to) . " destinații");
            }
            
            Log::info('Backup creat prin comandă artisan', [
                'backup_id' => $backup->id,
                'type' => $type,
            ]);
            
            return 0;
            
        } catch (\Exception $e) {
            $this->error('❌ Eroare la crearea backup-ului: ' . $e->getMessage());
            Log::error('Eroare backup artisan', [
                'error' => $e->getMessage(),
                'trace' => $e->getTraceAsString(),
            ]);
            
            return 1;
        }
    }
}
