<?php

namespace App\Modules\Ssl\Comodo;

use App\Core\Ssl\AbstractSsl;
use App\Models\ClientSslCertificate;

/**
 * Comodo / Sectigo / DigiCert benzeri commercial SSL reseller modülü
 * için **iskelet implementasyon** (PRC-57).
 *
 * Generic flow:
 *   1. Müşteri SSL ürününü satın alır → AbstractSsl::createAccount
 *      ClientSslCertificate row create eder, `installed=false`
 *   2. Müşteri client area'da "Kurulumu Başlat" tıklayıp form doldurur
 *      (CSR + organization + validation_email + ...)
 *   3. ClientAreaController::sslInstall → installCertificate çağrılır
 *   4. Bu modül CA API'sına order verir, dönen cert'i $cert row'una persist
 *      eder, `installed=true` flip'ler
 *
 * Şu anki implementasyon CA API entegrasyonu **yapmaz** — sadece submit'i
 * kabul eder, $cert.installation_input field'ına customer input'u kaydeder
 * ve `installed=false` durumunda bırakır. Admin manuel olarak gerçek cert'i
 * elle yapıştırır (admin Show sayfasındaki "Manual Install" butonu) ya da
 * gerçek CA API entegrasyonu eklenir.
 */
class Comodo extends AbstractSsl
{
    public function requiresCustomerInput(): bool
    {
        return true;
    }

    public function customerInputSchema(): array
    {
        return [
            [
                'key' => 'csr',
                'label' => 'Certificate Signing Request (CSR)',
                'type' => 'textarea',
                'required' => true,
                'help' => 'Sunucunuzdaki openssl ile üretilen PEM formatında CSR.',
            ],
            [
                'key' => 'admin_email',
                'label' => 'Domain Validation E-posta',
                'type' => 'email',
                'required' => true,
                'help' => 'CA bu adrese doğrulama linki gönderecek.',
                'options' => ['admin@', 'webmaster@', 'postmaster@', 'hostmaster@'],
            ],
            [
                'key' => 'organization',
                'label' => 'Kurum Adı',
                'type' => 'text',
                'required' => false,
                'help' => 'OV/EV cert için zorunlu.',
            ],
            [
                'key' => 'organization_unit',
                'label' => 'Birim',
                'type' => 'text',
                'required' => false,
            ],
            [
                'key' => 'country',
                'label' => 'Ülke (ISO-2)',
                'type' => 'text',
                'required' => false,
            ],
            [
                'key' => 'state',
                'label' => 'İl/State',
                'type' => 'text',
                'required' => false,
            ],
            [
                'key' => 'city',
                'label' => 'Şehir',
                'type' => 'text',
                'required' => false,
            ],
        ];
    }

    public function adminFields(): array
    {
        return [
            'api_key' => [
                'type' => 'password',
                'label' => 'CA API Key',
                'description' => 'Reseller hesabınızın API anahtarı.',
                'required' => false,
            ],
            'product_code' => [
                'type' => 'text',
                'label' => 'CA Product Code',
                'description' => 'Örn: PositiveSSL, EssentialSSL, EVSSL.',
                'required' => false,
            ],
        ];
    }

    public function paramSchema(): array
    {
        return [];
    }

    public function testConnection(array $params): array
    {
        $apiKey = $params['module_config']['api_key'] ?? null;
        if (empty($apiKey)) {
            return $this->fail('API key configured değil — gerçek bağlantı testi için reseller credentials gerekli.');
        }

        // Gerçek implementasyon: CA-spesifik /healthcheck endpoint'i çağrılır.
        return $this->ok('API key set; gerçek CA çağrısı bu iskelet modülde uygulanmamış.');
    }

    /**
     * MANUEL reseller iskeleti — otomatik issuance YOK. Bu modül CA REST
     * API'sına order VERMEZ; sadece müşteri girdisini (CSR + form) persist
     * eder ve sertifikayı `installed=false` bekleme durumunda bırakır.
     *
     * DÜRÜSTLÜK SÖZLEŞMESİ: `success` DÖNDÜRÜLMEZ. ClientAreaController
     * `status === 'success'` dönüşünü "kurulum tamamlandı/gönderildi"
     * (installed) kabul eder (bkz. sslInstall); oysa AbstractSsl sözleşmesi
     * success için `installed=true` + cert/chain/private_key bekler. Otomatik
     * issuance olmadan `ok()` dönmek sahte "hazır olacak" implikasyonu üretir.
     * Bunun yerine dürüst ASKIDA durumu (`failed` = non-success) döneriz;
     * durum CA + admin manuel müdahalesine bağlıdır.
     *
     * FOLLOW-UP: admin manuel-install backstop (gerçek cert'i elle yapıştırıp
     * `installed=true` flip'leyen route/controller/view) KODDA YOK. Onsuz
     * müşteri girdisi kalıcı olarak askıda kalır. Ayrı ticket gerekir.
     */
    public function installCertificate(
        ClientSslCertificate $cert,
        array $customerInput,
        array $moduleConfig,
    ): array {
        if (empty($customerInput['csr'])) {
            return $this->fail('CSR zorunlu.');
        }

        $cert->update([
            'installation_input' => $customerInput,
            'csr' => $customerInput['csr'],
            'last_attempt_at' => now(),
            'module_data' => array_merge((array) ($cert->module_data ?? []), [
                'ca_provider' => 'comodo',
                'pending_admin_action' => true,
                'submitted_at' => now()->toIso8601String(),
            ]),
        ]);

        // Otomatik issuance YOK: cert `installed=false` kalır. Durumu dürüst
        // olarak ASKIDA bildiririz — sahte "hazır olacak" implikasyonu yok.
        // (Controller bunu non-success kabul edip mesajı müşteriye gösterir;
        //  installed=true'ya YANLIŞLIKLA terfi ettirmez.)
        return $this->fail(
            'Sertifika talebiniz ve CSR bilgileriniz kaydedildi. Bu ürün MANUEL bir '
            .'reseller sertifikasıdır — otomatik doğrulama/kurulum yapılmaz. '
            .'Ekibimiz CA doğrulamasını manuel tamamladıktan sonra sertifika '
            .'kurulacaktır; kurulum tamamlanana kadar durum "beklemede" olarak kalır.',
            [
                'cert_id' => $cert->id,
                'installed' => false,
                'pending_admin_action' => true,
            ]
        );
    }
}
