<?php

declare(strict_types=1);

namespace App\Http\Controllers\Customer\Concerns;

use App\Domain\Account\Models\Account;
use App\Domain\Domain\Models\Domain;
use App\Domain\Htaccess\Services\HtaccessProvisioner;
use Illuminate\Support\Facades\Log;
use Throwable;

/**
 * Tek-satır kullanım için yardımcı. Her .htaccess yazan customer controller'da
 * DB değişikliği commit edildikten sonra çağırılır.
 *
 * rebuildHtaccess($account) — hesabın tüm domainleri için rebuild
 * rebuildHtaccessForDomain($domain) — sadece tek domain için rebuild
 *
 * sysapi başarısız olursa istek başarısız sayılmaz: DB satırı zaten yazıldı,
 * provision hatası audit log'a düşer ve panelde flash mesajıyla bildirilir.
 * Bu sayede UI çakılmaz ve operatör arka planda tekrar deneyebilir.
 */
trait RebuildsHtaccess
{
    protected function rebuildHtaccess(Account $account): ?string
    {
        try {
            app(HtaccessProvisioner::class)->rebuildForAccount($account);

            return null;
        } catch (Throwable $e) {
            Log::warning('htaccess rebuild failed', [
                'account_id' => $account->id,
                'error' => $e->getMessage(),
            ]);

            return $e->getMessage();
        }
    }

    protected function rebuildHtaccessForDomain(Domain $domain): ?string
    {
        try {
            app(HtaccessProvisioner::class)->rebuildForDomain($domain);

            return null;
        } catch (Throwable $e) {
            Log::warning('htaccess rebuild failed', [
                'domain_id' => $domain->id,
                'error' => $e->getMessage(),
            ]);

            return $e->getMessage();
        }
    }
}
