<?php

declare(strict_types=1);

namespace App\Providers;

use App\Domain\Sysapi\Bridges\FakeSysapi;
use App\Domain\Sysapi\Bridges\SudoBashSysapi;
use App\Domain\Sysapi\Contracts\SysapiBridge;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\ServiceProvider;
use InvalidArgumentException;
use RuntimeException;

/**
 * Sysapi bridge'inin DI container'a kayıt yeri.
 *
 * Driver öncelik sırası:
 *   1. config('onoxsoft.sysapi.driver') — primary config
 *   2. config('sysapi.adapter')         — alias config (config/sysapi.php)
 *
 * Desteklenen driver'lar:
 *   - 'sudo-bash' → SudoBashSysapi (production, AlmaLinux 9)
 *   - 'fake'      → FakeSysapi (testing + dev/Windows)
 *
 * GÜVENLİK:
 *   - Production (APP_ENV=production) + non-CLI + fake driver kombinasyonu HATA fırlatır.
 *     Yanlış config'le production'da sessizce fake'e düşmek ÇOK TEHLİKELİDİR (admin
 *     "yedek alındı" sanır, oysa sysapi hiç çalışmamıştır).
 *   - Bu guard'ı bypass etmek için ONOX_ALLOW_FAKE_IN_PRODUCTION=1 env değişkeni
 *     gerekir (sadece kasıtlı acil debug için, log'a uyarı düşer).
 *   - Testing env'de otomatik fake — config override gerekmez.
 */
final class SysapiServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->app->singleton(SysapiBridge::class, function (Application $app): SysapiBridge {
            // Test ortamında her zaman fake
            if ($app->environment('testing')) {
                return new FakeSysapi;
            }

            $driver = (string) config('onoxsoft.sysapi.driver', config('sysapi.adapter', 'fake'));

            // ─── Production safety guard ──────────────────────────────────
            if ($driver === 'fake' && $app->environment('production')) {
                $bypass = (string) env('ONOX_ALLOW_FAKE_IN_PRODUCTION', '0') === '1';

                if (! $bypass) {
                    // Hata fırlat — controller'ların FakeSysapi'ye düşmesini engelle.
                    // Yanlış yapılandırma fail-fast olsun ki yedek/DKIM gibi destructive
                    // op'lar sahte success ile devam etmesin.
                    throw new RuntimeException(
                        'SECURITY: FakeSysapi production environment\'ta yasaklı. '
                        .'.env\'de SYSAPI_DRIVER=sudo-bash (veya onoxsoft.sysapi.driver=sudo-bash) ayarlayın. '
                        .'Bilinçli debug için ONOX_ALLOW_FAKE_IN_PRODUCTION=1 set edilebilir.'
                    );
                }

                Log::warning('sysapi.fake_in_production_bypassed', [
                    'note' => 'FakeSysapi production\'da çalışıyor (ONOX_ALLOW_FAKE_IN_PRODUCTION=1 bypass). '
                            .'Bu kasıtlıysa OK, değilse acil müdahale gerekir.',
                ]);
            }

            return match ($driver) {
                'sudo-bash' => new SudoBashSysapi(
                    binDir: (string) config('onoxsoft.sysapi.bin_dir', config('sysapi.bin_dir')),
                    sudoBinary: (string) config('onoxsoft.sysapi.sudo_binary', '/usr/bin/sudo'),
                ),
                'fake' => new FakeSysapi,
                default => throw new InvalidArgumentException(
                    "Bilinmeyen sysapi driver: {$driver} (geçerli: sudo-bash, fake)"
                ),
            };
        });
    }
}
