<?php

declare(strict_types=1);

namespace App\Domain\Ssl\Exceptions;

use App\Domain\Sysapi\Contracts\SysapiResult;
use RuntimeException;

/**
 * AutoSSL spesifik istisnaları — cPanel AutoSSL davranışını izler.
 *
 * SslException'dan ayrı tutuluyor çünkü AutoSSL flow:
 *   - DNS preflight (reachable subdomain check) içerir
 *   - Multi-SAN tek cert prensibiyle çalışır
 *   - Asenkron job ile tetiklenebilir
 *
 * Phase 1 Epic 9.5 — AutoSSL.
 */
class AutoSslException extends RuntimeException
{
    public function __construct(string $message, public readonly ?SysapiResult $sysapiResult = null)
    {
        parent::__construct($message);
    }

    public static function noReachableHosts(string $domain): self
    {
        return new self(
            "AutoSSL: {$domain} için DNS A kaydı olan hiçbir subdomain bulunamadı; "
            ."HTTP-01 challenge başarısız olur, deneme atlandı."
        );
    }

    public static function autoSslDisabled(): self
    {
        return new self('AutoSSL sistem ayarlarından kapalı (autossl_settings.enabled=0).');
    }

    public static function domainOptedOut(string $domain): self
    {
        return new self("Domain {$domain} AutoSSL'i devre dışı bırakmış (ssl_enabled=false).");
    }

    public static function sysapiFailed(string $domain, SysapiResult $r): self
    {
        return new self(
            "AutoSSL provisioning {$domain} için başarısız (exit {$r->exitCode}): {$r->stderr}",
            $r,
        );
    }
}
