<?php

namespace App\Http\Controllers\Store;

use App\Http\Controllers\Controller;
use App\Models\Brand;
use App\Models\ClientActivityLog;
use App\Models\Language;
use App\Models\Page;
use App\Models\Reseller;
use App\Services\PageBuilder\ReservedSlugs;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;

/**
 * PRC-844 (Faz 5) — reseller brand-scoped sayfa yönetimi.
 *
 * Reseller kendi brand'ine (vitrin) ait sayfaları (anasayfa dahil) oluşturur/
 * düzenler. Mevcut sayfa motoru yeniden kullanılır: StorePageController zaten
 * brand-scoped sayfayı çözer, PageRenderer brand+currency bazlı cache'ler,
 * PageObserver save/delete'te cache'i temizler. Bu controller yalnızca
 * yetkilendirme + basit içerik editörü katmanını ekler.
 *
 * İçerik MVP'si: tek `html_embed` bloğu (reseller zaten brand'inde custom_js/css
 * yazabildiği için ham HTML aynı güven modeliyle tutarlı). Admin'in gelişmiş
 * page-builder ile ürettiği çok-bloklu sayfalar "advanced" kabul edilir; reseller
 * bunların yalnız meta verisini düzenler, blok içeriği KORUNUR (veri kaybı yok).
 */
class ResellerPageController extends Controller
{
    public function index(Brand $site)
    {
        $reseller = $this->authorizeSite($site);

        $pages = Page::where('brand_id', $site->id)
            ->orderByDesc('is_home')
            ->orderBy('locale')
            ->orderBy('slug')
            ->get();

        return view('clientarea.reseller.sites.pages.index', compact('reseller', 'site', 'pages'));
    }

    public function create(Brand $site)
    {
        $reseller = $this->authorizeSite($site);
        $locales = $this->locales();

        return view('clientarea.reseller.sites.pages.create', compact('reseller', 'site', 'locales'));
    }

    public function store(Request $request, Brand $site)
    {
        $reseller = $this->authorizeSite($site);

        $data = $this->validatePage($request, $site, null);

        DB::beginTransaction();
        try {
            $page = new Page([
                'brand_id' => $site->id,
                'locale' => $data['locale'],
                'slug' => $data['slug'],
                'title' => $data['title'],
                'status' => $data['status'],
                'is_home' => $data['is_home'],
                'meta_title' => $data['meta_title'] ?? null,
                'meta_description' => $data['meta_description'] ?? null,
                'content' => $this->buildContent($data['content_html'] ?? ''),
                'published_at' => $data['status'] === 'published' ? now() : null,
            ]);
            $page->created_by_reseller_id = $reseller->id;
            $page->save();

            ClientActivityLog::log(
                action: 'reseller',
                entityType: 'page',
                entityId: $page->id,
                description: "Created brand page '{$page->title}' (slug: {$page->slug}, locale: {$page->locale}) for site {$site->name}"
            );

            DB::commit();
        } catch (\Throwable $e) {
            DB::rollBack();
            return back()->withInput()->with('error', $e->getMessage());
        }

        return redirect()->route('store.auth.reseller.sites.pages.edit', [$site, $page])
            ->with('success', 'Sayfa oluşturuldu.');
    }

    public function edit(Brand $site, Page $page)
    {
        $reseller = $this->authorizeSite($site);
        $this->assertPageBelongsToSite($site, $page);

        $locales = $this->locales();
        $isAdvanced = $this->isAdvancedContent($page->content);
        $contentHtml = $isAdvanced ? null : $this->extractHtml($page->content);

        return view('clientarea.reseller.sites.pages.edit', compact('reseller', 'site', 'page', 'locales', 'isAdvanced', 'contentHtml'));
    }

    public function update(Request $request, Brand $site, Page $page)
    {
        $reseller = $this->authorizeSite($site);
        $this->assertPageBelongsToSite($site, $page);

        $isAdvanced = $this->isAdvancedContent($page->content);
        $data = $this->validatePage($request, $site, $page, $isAdvanced);

        DB::beginTransaction();
        try {
            $page->fill([
                'locale' => $data['locale'],
                'slug' => $data['slug'],
                'title' => $data['title'],
                'status' => $data['status'],
                'is_home' => $data['is_home'],
                'meta_title' => $data['meta_title'] ?? null,
                'meta_description' => $data['meta_description'] ?? null,
            ]);

            // Advanced (admin page-builder) içerik KORUNUR — reseller sadece meta düzenler.
            if (! $isAdvanced) {
                $page->content = $this->buildContent($data['content_html'] ?? '');
            }

            if ($page->status === 'published' && ! $page->published_at) {
                $page->published_at = now();
            }

            $page->updated_by_reseller_id = $reseller->id;
            $page->save();

            ClientActivityLog::log(
                action: 'reseller',
                entityType: 'page',
                entityId: $page->id,
                description: "Updated brand page '{$page->title}' (slug: {$page->slug}) for site {$site->name}"
            );

            DB::commit();
        } catch (\Throwable $e) {
            DB::rollBack();
            return back()->withInput()->with('error', $e->getMessage());
        }

        return redirect()->route('store.auth.reseller.sites.pages.edit', [$site, $page])
            ->with('success', 'Sayfa güncellendi.');
    }

    public function destroy(Brand $site, Page $page)
    {
        $reseller = $this->authorizeSite($site);
        $this->assertPageBelongsToSite($site, $page);

        DB::beginTransaction();
        try {
            $title = $page->title;
            $page->delete();

            ClientActivityLog::log(
                action: 'reseller',
                entityType: 'page',
                entityId: null,
                description: "Deleted brand page '{$title}' for site {$site->name}"
            );

            DB::commit();
        } catch (\Throwable $e) {
            DB::rollBack();
            return back()->with('error', $e->getMessage());
        }

        return redirect()->route('store.auth.reseller.sites.pages.index', $site)
            ->with('success', 'Sayfa silindi.');
    }

    /**
     * Aktif reseller doğrula + brand sahipliğini kontrol et. 403 aksi halde.
     */
    private function authorizeSite(Brand $site): Reseller
    {
        $client = Auth::guard('client')->user();
        $reseller = $client?->resellerProfile;

        if (! $reseller || $reseller->status !== 'active') {
            abort(403);
        }

        if ($site->reseller_id !== $reseller->id) {
            abort(403);
        }

        return $reseller;
    }

    private function assertPageBelongsToSite(Brand $site, Page $page): void
    {
        if ($page->brand_id !== $site->id) {
            abort(404);
        }
    }

    /**
     * Ortak validasyon. Slug (brand_id, locale) içinde benzersiz + rezerve
     * değil; advanced içerikte content_html istenmez.
     */
    private function validatePage(Request $request, Brand $site, ?Page $page, bool $isAdvanced = false): array
    {
        $locale = $request->input('locale');

        $rules = [
            'title' => 'required|string|max:200',
            'locale' => ['required', 'string', Rule::in($this->localeCodes())],
            'slug' => [
                'required', 'string', 'max:180', 'regex:/^[a-z0-9\-]+$/',
                Rule::unique('pages', 'slug')
                    ->where(fn ($q) => $q->where('brand_id', $site->id)->where('locale', $locale))
                    ->ignore($page?->id),
                function ($attr, $value, $fail) {
                    if (ReservedSlugs::isReserved($value)) {
                        $fail("'{$value}' rezerve bir slug, kullanılamaz.");
                    }
                },
            ],
            'status' => ['required', Rule::in(['draft', 'published'])],
            'is_home' => 'nullable|boolean',
            'meta_title' => 'nullable|string|max:200',
            'meta_description' => 'nullable|string|max:320',
        ];

        if (! $isAdvanced) {
            $rules['content_html'] = 'nullable|string';
        }

        $validated = $request->validate($rules);
        $validated['is_home'] = $request->boolean('is_home');

        return $validated;
    }

    /** İçeriği tek html_embed bloğu olarak sar. */
    private function buildContent(string $html): array
    {
        $html = trim($html);
        if ($html === '') {
            return ['blocks' => []];
        }

        return ['blocks' => [[
            'type' => 'html_embed',
            'id' => (string) \Illuminate\Support\Str::uuid(),
            'data' => ['html' => $html],
            'options' => [],
        ]]];
    }

    /** Basit içerikten (tek html_embed) HTML'i geri çıkar. */
    private function extractHtml(?array $content): string
    {
        $blocks = $content['blocks'] ?? [];
        if (count($blocks) === 1 && ($blocks[0]['type'] ?? null) === 'html_embed') {
            return (string) ($blocks[0]['data']['html'] ?? '');
        }

        return '';
    }

    /**
     * Admin page-builder'ıyla üretilmiş çok-bloklu / farklı-tip içerik mi?
     * Öyleyse reseller basit editörle DÜZENLEYEMEZ (veri kaybını önler) —
     * yalnız meta düzenlenir, bloklar korunur.
     */
    private function isAdvancedContent(?array $content): bool
    {
        $blocks = $content['blocks'] ?? [];
        if ($blocks === []) {
            return false;
        }

        return ! (count($blocks) === 1 && ($blocks[0]['type'] ?? null) === 'html_embed');
    }

    private function locales()
    {
        return Language::where('status', true)->get(['a2_iso', 'native_name']);
    }

    private function localeCodes(): array
    {
        return Language::where('status', true)->pluck('a2_iso')->all();
    }
}
