<?php

namespace App\Jobs\Site;

use App\Models\Agency\Agency;
use App\Services\Site\DomainProvisioningService;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

/**
 * Özel domainin DNS kayıtlarını (TXT sahiplik + A trafiği) poll eder.
 * Doğrulanamazsa artan aralıklarla kendini yeniden kuyruğa alır (maks ~24 saat).
 */
class VerifyDomainDnsJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public int $tries = 1; // yeniden deneme kendi release mantığıyla

    public function __construct(
        public int $agencyId,
        public int $attemptNo = 1,
    ) {
    }

    public function handle(DomainProvisioningService $service): void
    {
        $agency = Agency::find($this->agencyId);
        if (! $agency || $agency->domain_status !== DomainProvisioningService::STATUS_PENDING) {
            return; // domain kaldırılmış ya da durum ilerlemiş
        }

        if ($service->verifyDns($agency)) {
            return; // provisioning job'ı servis içinde dispatch edildi
        }

        // 1dk, 2dk, 4dk ... maks 30dk aralıklarla ~24 saat dene
        if ($this->attemptNo < 60) {
            $delay = min(30, 2 ** min($this->attemptNo - 1, 5)) * 60;
            self::dispatch($this->agencyId, $this->attemptNo + 1)->delay(now()->addSeconds($delay));
        } else {
            $agency->forceFill([
                'domain_status_message' => 'DNS kayıtları 24 saat içinde doğrulanamadı. Kayıtları kontrol edip "Yeniden Doğrula" deyin.',
            ])->save();
        }
    }
}
