<?php

namespace App\Http\Controllers\Admin;

/*
 * ReviewAdminController — CRUD отзывов клиентов.
 *
 * Создан: 2026-05-07
 * Маршруты: resource /admin/reviews (index, create, store, edit, update, destroy)
 *           POST /admin/reviews/{review}/toggle — переключение is_active
 * Защита: middleware 'admin' (EnsureUserIsAdmin)
 *
 * После изменения отзывов сбрасывается кеш страниц, где они используются.
 */

use App\Http\Controllers\Controller;
use App\Models\Review;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\View\View;

class ReviewAdminController extends Controller
{
    // Список всех отзывов, упорядочен по sort_order, затем по дате создания
    public function index(): View
    {
        $reviews = Review::orderBy('sort_order')->orderByDesc('created_at')->get();

        return view('admin.reviews.index', compact('reviews'));
    }

    // Форма создания нового отзыва
    public function create(): View
    {
        return view('admin.reviews.form', ['review' => new Review]);
    }

    // Сохранение нового отзыва
    public function store(Request $request): RedirectResponse
    {
        $data = $this->validated($request);
        Review::create($data);
        $this->flushCache();

        return redirect()->route('admin.reviews.index')->with('success', 'Отзыв добавлен.');
    }

    // Форма редактирования отзыва
    public function edit(Review $review): View
    {
        return view('admin.reviews.form', compact('review'));
    }

    // Обновление отзыва
    public function update(Request $request, Review $review): RedirectResponse
    {
        $review->update($this->validated($request));
        $this->flushCache();

        return redirect()->route('admin.reviews.index')->with('success', 'Отзыв обновлён.');
    }

    // Удаление отзыва
    public function destroy(Review $review): RedirectResponse
    {
        $review->delete();
        $this->flushCache();

        return redirect()->route('admin.reviews.index')->with('success', 'Отзыв удалён.');
    }

    // Переключение видимости (активен / скрыт) без перехода на форму
    public function toggle(Review $review): RedirectResponse
    {
        $review->update(['is_active' => ! $review->is_active]);
        $this->flushCache();

        return back()->with('success', $review->is_active ? 'Отзыв активирован.' : 'Отзыв скрыт.');
    }

    // ── Приватные вспомогательные ────────────────────────────────────────

    // Валидация и подготовка данных из запроса
    private function validated(Request $request): array
    {
        $request->validate([
            'author' => 'required|string|max:128',
            'car_name' => 'nullable|string|max:128',
            'rating' => 'required|integer|min:1|max:5',
            'body' => 'required|string|max:2000',
            'review_date' => 'nullable|date',
            'is_active' => 'nullable|boolean',
            'sort_order' => 'nullable|integer|min:0',
        ]);

        return [
            'author' => $request->input('author'),
            'car_name' => $request->input('car_name') ?: null,
            'rating' => (int) $request->input('rating', 5),
            'body' => $request->input('body'),
            'review_date' => $request->input('review_date') ?: null,
            'is_active' => $request->boolean('is_active'),
            'sort_order' => (int) $request->input('sort_order', 0),
        ];
    }

    // Сбрасываем кеш страниц при изменении отзывов
    private function flushCache(): void
    {
        foreach (['home', 'services', 'contacts', 'privacy', 'offer'] as $slug) {
            Cache::forget('page_sections.'.$slug);
            Cache::forget('page.'.$slug);
        }
    }
}
