<?php

namespace App\Http\Middleware;

use App\Models\Brand;
use App\Services\Store\BrandContext;
use App\Services\ThemeManager;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\View;
use Symfony\Component\HttpFoundation\Response;

/**
 * PRC-840 — Host → Brand çözümünün TEK noktası. `web` + `storeapi` middleware
 * gruplarında global çalışır (eskiden route-grubu bazında dağınıktı ve
 * ürün/basket/checkout route'larında HİÇ yoktu → checkout brand damgalaması
 * sessizce çalışmıyordu).
 *
 * Sorumluluklar:
 *  1. Host'u normalize et (www. soy) → doğrulanmış+aktif brand ara
 *  2. BrandContext::set() — tüm brand kararlarının tek kaynağını doldur
 *     (app('brand') geriye-uyum alias'ı geçici olarak korunur)
 *  3. Brand teması varsa view finder'a prepend et (per-request; compiled view
 *     cache path-keyed olduğundan temalar çakışmaz)
 *  4. Domain brands tablosunda VAR ama servis edilemez durumda
 *     (doğrulanmamış / pasif / reseller aktif değil) → nötr 503 (ana site
 *     SIZDIRILMAZ)
 *
 * `/.well-known/*` (ACME) her karardan muaf — SSL-B hazırlığı.
 */
class ResolveBrand
{
    public function handle(Request $request, Closure $next): Response
    {
        // ACME/well-known: brand kararına girmeden geç (webserver challenge'ı)
        if ($request->is('.well-known/*')) {
            return $next($request);
        }

        $host = strtolower($request->getHost());
        $host = preg_replace('/^www\./', '', $host);

        $record = Brand::where('domain', $host)->with('reseller')->first();

        $servable = $record
            && $record->is_active
            && $record->domain_verified
            && $record->reseller?->status === 'active';

        if ($record && ! $servable) {
            // Domain bize yönlenmiş ama site hazır/aktif değil: ana siteyi
            // GÖSTERME (whitelabel sızıntısı) — nötr bekleme sayfası.
            return response()->view('errors.brand-unavailable', [], 503);
        }

        $brand = $servable ? $record : null;

        app(BrandContext::class)->set($brand);

        // Geriye-uyum: mevcut tüketiciler (layout, StorePageController, MenuRenderer…)
        // app('brand') okuyor; BrandContext'e taşınana dek alias korunur.
        app()->instance('brand', $brand);
        View::share('brand', $brand);

        if ($brand) {
            $this->applyBrandTheme($brand->theme);

            // Kimlik override'ları: appName/companyLogo AppServiceProvider'da
            // global paylaşılıyor — burada brand'inkiyle ezilir ki HER TEMA
            // (title, navbar, footer) blade değişikliği olmadan brand kimliği
            // göstersin. Logo yoksa '' (ana logo SIZDIRILMAZ — isim gösterilir).
            View::share('appName', $brand->name);
            View::share('companyLogo', $brand->logo ?: '');
        }

        return $next($request);
    }

    /**
     * Brand temasını request-scoped uygula: ThemeServiceProvider boot'ta ana
     * temayı prepend etti; brand teması ondan farklıysa view path'ini EN öne
     * ekleriz (öncelik kazanır). Tema klasörü yoksa sessiz fallback + log.
     */
    private function applyBrandTheme(?string $theme): void
    {
        if ($theme === null || $theme === '') {
            return;
        }

        $themeManager = app(ThemeManager::class);

        if (! $themeManager->exists($theme)) {
            Log::warning('Brand theme not found, falling back to active theme', ['theme' => $theme]);

            return;
        }

        if ($theme === $themeManager->getActive()) {
            return; // zaten aktif tema — provider prepend etti
        }

        View::getFinder()->prependLocation($themeManager->getViewsPath($theme));
        View::share('activeTheme', $theme);
        View::share('themeAssets', $themeManager->getAssets($theme));
    }
}
