<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\ProductCategory;
use Illuminate\Http\Request;

class ProductCategoryController extends Controller
{
    public function index()
    {
        $categories = ProductCategory::with('subCategories')
            ->whereNull('parent_id')
            ->orderBy('sort_order')
            ->orderBy('id')
            ->get();
        return view('admin.products.categories.index', compact('categories'));
    }

    public function create()
    {
        $parents = ProductCategory::flatTree();
        return view('admin.products.categories.create', compact('parents'));
    }

    public function store(Request $request)
    {
        $request->validate([
            'name'            => 'required|string|max:100|unique:product_categories,name',
            'slug'            => 'nullable|string|max:120|unique:product_categories,slug',
            'parent_id'       => 'nullable|exists:product_categories,id',
            'sort_order'      => 'nullable|integer|min:0',
            'is_active'       => 'required|boolean',
            'icon'            => 'nullable|string|max:60',
            'mega_menu_image' => 'nullable|image|max:2048',
        ], [
            'name.required'         => 'نام دسته‌بندی الزامی است.',
            'name.unique'           => 'این نام دسته‌بندی قبلاً ثبت شده است.',
            'slug.unique'           => 'این slug قبلاً ثبت شده است.',
            'mega_menu_image.image' => 'فایل باید تصویر باشد.',
            'mega_menu_image.max'   => 'حداکثر حجم تصویر ۲ مگابایت است.',
        ]);

        $slug = ProductCategory::generateSlug($request->slug ?: $request->name);

        ProductCategory::create([
            'name'            => $request->name,
            'slug'            => $slug,
            'parent_id'       => $request->parent_id ?: null,
            'sort_order'      => $request->sort_order ?? 0,
            'is_active'       => $request->is_active,
            'icon'            => $request->icon ?: null,
            'mega_menu_image' => $this->uploadMegaImage($request),
        ]);

        return redirect()->route('admin.products.categories.index')
            ->with('success', 'دسته‌بندی با موفقیت ثبت شد.');
    }

    public function edit(ProductCategory $category)
    {
        $parents = ProductCategory::flatTree($category->id);
        return view('admin.products.categories.edit', compact('category', 'parents'));
    }

    public function update(Request $request, ProductCategory $category)
    {
        $request->validate([
            'name'            => 'required|string|max:100|unique:product_categories,name,' . $category->id,
            'slug'            => 'nullable|string|max:120|unique:product_categories,slug,' . $category->id,
            'parent_id'       => 'nullable|exists:product_categories,id',
            'sort_order'      => 'nullable|integer|min:0',
            'is_active'       => 'required|boolean',
            'icon'            => 'nullable|string|max:60',
            'mega_menu_image' => 'nullable|image|max:2048',
        ], [
            'name.required'         => 'نام دسته‌بندی الزامی است.',
            'name.unique'           => 'این نام دسته‌بندی قبلاً ثبت شده است.',
            'slug.unique'           => 'این slug قبلاً ثبت شده است.',
            'mega_menu_image.image' => 'فایل باید تصویر باشد.',
            'mega_menu_image.max'   => 'حداکثر حجم تصویر ۲ مگابایت است.',
        ]);

        $slug = $request->slug
            ? ProductCategory::generateSlug($request->slug, $category->id)
            : ProductCategory::generateSlug($request->name, $category->id);

        $newMega = $this->uploadMegaImage($request);

        $category->update([
            'name'            => $request->name,
            'slug'            => $slug,
            'parent_id'       => $request->parent_id ?: null,
            'sort_order'      => $request->sort_order ?? 0,
            'is_active'       => $request->is_active,
            'icon'            => $request->icon ?: null,
            'mega_menu_image' => $newMega ?? $category->mega_menu_image,
        ]);

        return redirect()->route('admin.products.categories.index')
            ->with('success', 'دسته‌بندی با موفقیت ویرایش شد.');
    }

    public function destroy(ProductCategory $category)
    {
        $category->delete();
        return back()->with('success', 'دسته‌بندی حذف شد.');
    }

    private function uploadMegaImage(Request $request): ?string
    {
        if (!$request->hasFile('mega_menu_image')) {
            return null;
        }
        $file     = $request->file('mega_menu_image');
        $filename = time() . '_mega_' . $file->getClientOriginalName();
        $dir      = public_path('uploads/categories');
        if (!is_dir($dir)) {
            mkdir($dir, 0755, true);
        }
        $file->move($dir, $filename);
        return $filename;
    }

    public function reorder(Request $request)
    {
        $request->validate([
            'items'                => 'required|array',
            'items.*.id'           => 'required|integer|exists:product_categories,id',
            'items.*.parent_id'    => 'nullable|integer|exists:product_categories,id',
            'items.*.sort_order'   => 'required|integer',
        ]);

        foreach ($request->items as $item) {
            ProductCategory::where('id', $item['id'])->update([
                'parent_id'  => $item['parent_id'] ?? null,
                'sort_order' => $item['sort_order'],
            ]);
        }

        return response()->json(['ok' => true]);
    }
}
