<?php

declare(strict_types=1);

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

class SecretsAuditCommand extends Command
{
    protected $signature = 'onox:secrets-audit';

    protected $description = 'Hassas alanlarda şifreleme ve .env izinlerini denetler';

    public function handle(): int
    {
        $issues = [];

        // .env dosya izinleri
        $envPath = base_path('.env');
        if (file_exists($envPath)) {
            $perms = substr(sprintf('%o', fileperms($envPath)), -4);
            if (! in_array($perms, ['0600', '0640'], true)) {
                $issues[] = ".env izinleri çok geniş: {$perms} (0600 veya 0640 olmalı)";
            }
        }

        // APP_KEY kontrolü
        if (empty(config('app.key'))) {
            $issues[] = 'APP_KEY .env dosyasında tanımlanmamış';
        }

        // Kritik şifreli sütunlar
        $tables = [
            'backup_destinations' => ['s3_secret_key', 'b2_application_key', 'ftp_password', 'sftp_password'],
            'dkim_keys' => ['private_key'],
            'gpg_keys' => ['private_key'],
            'users' => ['two_factor_secret', 'two_factor_recovery_codes'],
        ];

        foreach ($tables as $table => $cols) {
            if (! Schema::hasTable($table)) {
                continue;
            }

            foreach ($cols as $col) {
                if (! Schema::hasColumn($table, $col)) {
                    continue;
                }

                $samples = DB::table($table)->whereNotNull($col)->limit(5)->pluck($col);
                foreach ($samples as $val) {
                    // Laravel şifreli değerleri base64 {"iv":...} ile başlar → eyJpdiI6
                    if ($val && ! str_starts_with((string) $val, 'eyJpdiI6')) {
                        $issues[] = "{$table}.{$col} sütununda şifrelenmemiş değer(ler) var.";
                        break;
                    }
                }
            }
        }

        if (empty($issues)) {
            $this->info('Secrets denetimi geçti — sorun bulunamadı.');

            return 0;
        }

        foreach ($issues as $issue) {
            $this->error($issue);
        }

        return 1;
    }
}
