<?php

namespace App\Http\Controllers\Install;

use App\Actions\Install\RunInstall;
use App\Http\Controllers\Controller;
use App\Services\Install\RequirementsChecker;
use App\Services\License\LicenseService;
use Illuminate\Http\Request;

/**
 * Kurulum sihirbazı (PRC-867) — Docker-first minimal.
 *
 * Adımlar session'da birikir; son adım ("kur") .env yazar, ProductionSeeder ile
 * migrate:seed eder, ayarları uygular, ilk admini oluşturur, kilit dosyasını yazar.
 * DB fresh install'da migrate edilmemiş olduğu için sihirbaz DB'ye dokunmaz
 * (yalnız son "kur" adımı, migrate'ten sonra).
 */
class InstallController extends Controller
{
    private const SESSION_KEY = 'install.wizard';

    /** Adım 1 — ön-koşul denetimi. */
    public function requirements(RequirementsChecker $checker)
    {
        return view('install.requirements', [
            'step' => 'requirements',
            'result' => $checker->run(),
        ]);
    }

    /** Adım 2 — lisans anahtarı formu. */
    public function license()
    {
        return view('install.license', ['step' => 'license', 'data' => $this->data()]);
    }

    public function storeLicense(Request $request, LicenseService $license)
    {
        $validated = $request->validate([
            'license_key' => ['required', 'string', 'max:191'],
        ]);

        $key = trim($validated['license_key']);

        // Girilen anahtarı lisans sunucusuyla doğrula (grace felsefesi):
        // - açıkça geçersiz (revoked/expired/binding) → engelle
        // - sunucuya ulaşılamıyor → uyarı ile geç
        $fresh = $license->refresh($key);
        if ($fresh !== null && empty($fresh['payload']['valid'])) {
            $status = $fresh['payload']['status'] ?? 'invalid';

            return back()->withInput()->with('error', "Lisans doğrulanamadı ({$status}). Anahtarı kontrol edin veya destekle iletişime geçin.");
        }

        $this->merge(['license_key' => $key]);

        $notice = $fresh === null
            ? 'Lisans sunucusuna şu an ulaşılamadı; kuruluma devam edilebilir (grace penceresinde doğrulanacak).'
            : 'Lisans doğrulandı.';

        return redirect()->route('install.application')->with('status', $notice);
    }

    /** Adım 3 — uygulama/şirket config. */
    public function application(Request $request)
    {
        return view('install.application', [
            'step' => 'application',
            'data' => $this->data(),
            'detectedUrl' => $request->getSchemeAndHttpHost(),
        ]);
    }

    public function storeApplication(Request $request)
    {
        $validated = $request->validate([
            'site_name' => ['required', 'string', 'max:191'],
            'app_url' => ['required', 'url', 'max:191'],
            'timezone' => ['required', 'string', 'max:64', 'timezone'],
            'locale' => ['required', 'string', 'in:tr,en'],
        ]);

        $this->merge($validated);

        return redirect()->route('install.admin');
    }

    /** Adım 4 — ilk admin hesabı. */
    public function admin()
    {
        return view('install.admin', ['step' => 'admin', 'data' => $this->data()]);
    }

    public function storeAdmin(Request $request)
    {
        // NOT: PasswordPolicy::rules() ayar tablosundan okur (henüz migrate
        // edilmedi) → burada temel min-8 kuralı; tam politika kurulum sonrası geçerli.
        $validated = $request->validate([
            'admin_name' => ['required', 'string', 'max:191'],
            'admin_email' => ['required', 'email', 'max:191'],
            'admin_password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);

        $this->merge($validated);

        return redirect()->route('install.review');
    }

    /** Adım 5 — özet + kur. */
    public function review()
    {
        $data = $this->data();
        if (empty($data['admin_email']) || empty($data['site_name'])) {
            return redirect()->route('install.requirements')->with('error', 'Lütfen tüm adımları tamamlayın.');
        }

        return view('install.review', ['step' => 'review', 'data' => $data]);
    }

    /** Kur & bitir — atomik son adım. */
    public function run()
    {
        $data = $this->data();

        if (empty($data['admin_email'])) {
            return redirect()->route('install.requirements')->with('error', 'Eksik kurulum verisi.');
        }

        app(RunInstall::class)->execute($data);
        session()->forget(self::SESSION_KEY);

        return view('install.complete', [
            'step' => 'complete',
            'loginUrl' => route('admin.login'),
        ]);
    }

    /** @return array<string,mixed> */
    private function data(): array
    {
        return (array) session(self::SESSION_KEY, []);
    }

    private function merge(array $values): void
    {
        session([self::SESSION_KEY => array_merge($this->data(), $values)]);
    }
}
