<?php

declare(strict_types=1);

namespace App\Domain\Ssl\Listeners;

use App\Domain\Domain\Events\DomainAdded;
use App\Jobs\ProvisionAutoSslJob;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

/**
 * DomainAdded event'ini dinler, AutoSSL provisioning'i kuyruğa atar.
 *
 * cPanel davranışı: yeni domain eklendiğinde DNS propagation'ı bekleyip
 * (~5dk gecikme) sistem subdomain'leri için tek multi-SAN cert alır.
 *
 * Hata fırlatmaz — AutoSSL opsiyonel feature. Loglar, devam eder.
 */
final class AutoSslOnDomainAdded
{
    public function handle(DomainAdded $event): void
    {
        $domain = $event->domain;

        // AutoSSL globally disabled?
        $enabled = DB::table('autossl_settings')->where('key', 'enabled')->value('value');
        if ($enabled !== '1' && $enabled !== 1) {
            Log::info('AutoSslOnDomainAdded: AutoSSL global olarak kapalı, atlandı', [
                'domain' => $domain->name,
            ]);

            return;
        }

        // Müşteri opt-out etmiş mi?
        if (! $domain->ssl_enabled) {
            Log::info('AutoSslOnDomainAdded: domain ssl_enabled=false, atlandı', [
                'domain' => $domain->name,
            ]);

            return;
        }

        try {
            // DNS propagation için 5dk gecikme — yeni eklenen zone'un upstream
            // resolver'lara yayılması için. acme.sh challenge'ı bundan önce
            // çalışırsa fail eder ve Let's Encrypt rate-limit kullanılır.
            dispatch(new ProvisionAutoSslJob($domain->id))->delay(now()->addMinutes(5));

            Log::info('AutoSslOnDomainAdded: AutoSSL job kuyruğa eklendi', [
                'domain' => $domain->name,
                'delay_minutes' => 5,
            ]);
        } catch (\Throwable $e) {
            Log::error('AutoSslOnDomainAdded: job dispatch başarısız', [
                'domain' => $domain->name,
                'error' => $e->getMessage(),
            ]);
        }
    }
}
