<?php

namespace App\Http\Controllers\Store;

use App\Http\Controllers\Controller;
use App\Models\Language;
use App\Models\Page;
use App\Services\PageBuilder\PageRenderer;
use App\Services\PageBuilder\ReservedSlugs;
use App\Services\VisitorService;

class StorePageController extends Controller
{
    public function show(string $slug = '', ?string $localeOverride = null)
    {
        // Reserved slug second-line check (validation bypass'a karşı)
        if ($slug !== '' && ReservedSlugs::isReserved($slug)) {
            abort(404);
        }

        $brandId = (app()->bound('brand') && app('brand')) ? app('brand')->id : null;

        try {
            // Tek-segment slug aktif non-default locale koduysa, locale homepage.
            // Örn: `/en` → EN home (site_default ≠ en olduğu sürece).
            if ($slug !== '' && $localeOverride === null && $this->isLocaleSegment($slug)) {
                $localeOverride = $slug;
                $slug = '';
            }

            if (empty($slug)) {
                if ($localeOverride !== null) {
                    // Explicit `/{locale}` (örn `/en`) — o locale'e kilitle
                    // (dokümante SEO davranışı; değiştirilmedi).
                    $locale = $localeOverride;
                    $this->switchAppLocale($locale);
                } else {
                    // PRC-505 — Bare `/`: render locale'i TEK KAYNAK olan Redis
                    // VISITORDETAIL'den gelir. SetStoreLocaleFromVisitor
                    // middleware'i `app()->getLocale()`'i visitor cookie →
                    // VISITORDETAIL.preferredLanguage ile zaten set etti.
                    // site_default'a ZORLAMA + `switchAppLocale` ile pref'i
                    // EZME (eski kod tam da bunu yapıp switcher'ı kırıyordu).
                    $locale = app()->getLocale();
                }
                $page = $this->resolveHomePage($locale, $brandId)
                    ?? $this->resolveHomePage(
                        Language::where('site_default', true)->value('a2_iso') ?? config('app.locale'),
                        $brandId
                    );
            } else {
                $locale = app()->getLocale();
                $page = $this->resolvePageBySlug($slug, $locale, $brandId);
                // SEO: slug başka bir locale'e aitse switch + sticky.
                if ($page && $page->locale && $page->locale !== app()->getLocale()) {
                    $this->switchAppLocale($page->locale);
                }
            }
        } catch (\Throwable $e) {
            \Log::error('Page resolve failed', ['slug' => $slug, 'error' => $e->getMessage()]);
            abort(500);
        }

        if (! $page) abort(404);
        if ($page->status !== 'published' && ! $this->canPreview()) abort(404);

        return app(PageRenderer::class)->renderResponse($page);
    }

    /**
     * Locale'i değiştir → Redis visitor info'ya yaz (tek source of truth).
     */
    private function switchAppLocale(string $locale): void
    {
        if (app()->getLocale() === $locale) {
            return;
        }
        app()->setLocale($locale);

        $visitorService = app(VisitorService::class);
        $visitorId = request()->attributes->get('visitor_id');
        if (! $visitorId) {
            $visitorId = $visitorService->getOrCreateVisitorId(request());
        }
        $visitorService->updateVisitorDetails($visitorId, ['preferredLanguage' => $locale]);
    }

    /**
     * Segment 2-letter ISO code AND aktif AND site_default değil mi?
     * Örn `/en` (TR site_default iken) true; `/tr` (TR site_default) false; `/qa` false.
     */
    private function isLocaleSegment(string $segment): bool
    {
        if (! preg_match('/^[a-z]{2}$/', $segment)) {
            return false;
        }
        return Language::active()
            ->where('a2_iso', $segment)
            ->where('site_default', false)
            ->exists();
    }

    private function resolveHomePage(string $locale, ?int $brandId): ?Page
    {
        // PRC-839 — branded storefront'ta ana marka SIZDIRILMAZ (PRC-840 sözleşmesi):
        // brand context'inde YALNIZ brand sayfaları çözülür; brand'in henüz
        // anasayfası yoksa master'a düşme, null dön (404/nötr). Master fallback
        // yalnız ana sitede ($brandId null) geçerli.
        if ($brandId) {
            return Page::where('brand_id', $brandId)->where('locale', $locale)
                ->where('is_home', true)->where('status', 'published')->first();
        }
        return Page::whereNull('brand_id')->where('locale', $locale)
            ->where('is_home', true)->where('status', 'published')->first();
    }

    private function resolvePageBySlug(string $slug, string $locale, ?int $brandId): ?Page
    {
        // PRC-839 — brand context'inde master sayfa fallback'i YOK (sızıntı önlenir).
        if ($brandId) {
            // 1. Brand + current locale
            $brandPage = Page::where('brand_id', $brandId)->where('locale', $locale)
                ->where('slug', $slug)->where('status', 'published')->first();
            if ($brandPage) return $brandPage;

            // 2. SEO fallback: slug başka bir locale'e ait olabilir — yalnız brand
            // kapsamında ara (controller `app()->setLocale()` ile dili ayarlar).
            return Page::where('brand_id', $brandId)
                ->where('slug', $slug)->where('status', 'published')->first();
        }

        // Ana site: master sayfalar
        // 1. Current locale
        $page = Page::whereNull('brand_id')->where('locale', $locale)
            ->where('slug', $slug)->where('status', 'published')->first();
        if ($page) return $page;

        // 2. SEO fallback: slug başka bir locale'e ait olabilir (örn TR mode'da `/pricing`).
        return Page::whereNull('brand_id')
            ->where('slug', $slug)->where('status', 'published')->first();
    }

    private function canPreview(): bool
    {
        return auth('admin')->check() && request()->query('preview') === '1';
    }
}
