<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\BlogPost;
use App\Models\Order;
use App\Models\Product;
use App\Models\ProductCategory;
use App\Models\Ticket;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

class AdminSearchController extends Controller
{
    private const LIMIT = 8;

    public function __invoke(Request $request): JsonResponse
    {
        $q = $this->normalize((string) $request->input('q', ''));

        if (mb_strlen($q) < 1) {
            return response()->json(['groups' => []]);
        }

        $groups = array_values(array_filter([
            $this->group('صفحات ادمین', 'pages', $this->searchPages($q)),
            $this->group('محصولات', 'products', $this->searchProducts($q)),
            $this->group('دسته‌بندی‌ها', 'categories', $this->searchCategories($q)),
            $this->group('سفارش‌ها', 'orders', $this->searchOrders($q)),
            $this->group('کاربران', 'users', $this->searchUsers($q)),
            $this->group('مطالب بلاگ', 'blog', $this->searchBlog($q)),
            $this->group('تیکت‌ها', 'tickets', $this->searchTickets($q)),
        ]));

        return response()->json(['groups' => $groups]);
    }

    private function group(string $title, string $key, array $items): ?array
    {
        if ($items === []) {
            return null;
        }

        return [
            'key'   => $key,
            'title' => $title,
            'items' => $items,
        ];
    }

    private function searchPages(string $q): array
    {
        $pages = [
            ['name' => 'داشبورد', 'url' => route('admin.index'), 'icon' => 'ti-layout-dashboard', 'keywords' => 'خانه صفحه اصلی'],
            ['name' => 'آمار و تحلیل', 'url' => route('admin.analytics.index'), 'icon' => 'ti-chart-bar', 'keywords' => 'analytics'],
            ['name' => 'محصولات', 'url' => route('admin.products.index'), 'icon' => 'ti-package', 'keywords' => 'کالا product'],
            ['name' => 'افزودن محصول', 'url' => route('admin.products.create'), 'icon' => 'ti-plus', 'keywords' => 'محصول جدید'],
            ['name' => 'دسته‌بندی محصولات', 'url' => route('admin.products.categories.index'), 'icon' => 'ti-category', 'keywords' => 'کتگوری category'],
            ['name' => 'برندها', 'url' => route('admin.brands.index'), 'icon' => 'ti-award', 'keywords' => 'brand برند'],
            ['name' => 'نظرات محصولات', 'url' => route('admin.reviews.index'), 'icon' => 'ti-message-star', 'keywords' => 'review کامنت'],
            ['name' => 'کدهای تخفیف', 'url' => route('admin.discount-codes.index'), 'icon' => 'ti-discount', 'keywords' => 'کوپن coupon تخفیف'],
            ['name' => 'سفارش‌ها', 'url' => route('admin.orders.index'), 'icon' => 'ti-shopping-cart', 'keywords' => 'order سفارش'],
            ['name' => 'درخواست‌های مرجوعی', 'url' => route('admin.orders.returns.index'), 'icon' => 'ti-truck-return', 'keywords' => 'return لغو مرجوعی'],
            ['name' => 'کاربران', 'url' => route('admin.users.index'), 'icon' => 'ti-users', 'keywords' => 'customer مشتری'],
            ['name' => 'کیف پول‌ها', 'url' => route('admin.wallets.index'), 'icon' => 'ti-wallet', 'keywords' => 'wallet موجودی'],
            ['name' => 'تراکنش‌های درگاه', 'url' => route('admin.finance.transactions.index'), 'icon' => 'ti-receipt', 'keywords' => 'finance پرداخت'],
            ['name' => 'اعلان‌ها', 'url' => route('admin.announcements.index'), 'icon' => 'ti-bell', 'keywords' => 'announcement اطلاعیه'],
            ['name' => 'مقالات بلاگ', 'url' => route('admin.blog.posts.index'), 'icon' => 'ti-article', 'keywords' => 'blog پست'],
            ['name' => 'افزودن مقاله', 'url' => route('admin.blog.posts.create'), 'icon' => 'ti-plus', 'keywords' => 'بلاگ جدید'],
            ['name' => 'دسته‌بندی بلاگ', 'url' => route('admin.blog.categories.index'), 'icon' => 'ti-category-2', 'keywords' => 'blog category'],
            ['name' => 'برچسب‌های بلاگ', 'url' => route('admin.blog.tags.index'), 'icon' => 'ti-tags', 'keywords' => 'tag تگ'],
            ['name' => 'تیکت‌های پشتیبانی', 'url' => route('admin.tickets.index'), 'icon' => 'ti-ticket', 'keywords' => 'support پشتیبانی'],
            ['name' => 'درخواست پشتیبانی جدید', 'url' => route('admin.tickets.new'), 'icon' => 'ti-plus', 'keywords' => 'تیکت جدید'],
            ['name' => 'دپارتمان‌های پشتیبانی', 'url' => route('admin.tickets.departments.index'), 'icon' => 'ti-building', 'keywords' => 'department'],
            ['name' => 'مدیریت بک‌آپ', 'url' => route('admin.settings.backups'), 'icon' => 'ti-database-export', 'keywords' => 'backup بکاپ پشتیبان'],
            ['name' => 'مرکز هوش مصنوعی', 'url' => route('admin.settings.ai-models'), 'icon' => 'ti-brain', 'keywords' => 'ai هوش مصنوعی تنظیمات'],
            ['name' => 'تنظیمات مدل‌ها', 'url' => route('admin.settings.ai-models'), 'icon' => 'ti-brain', 'keywords' => 'ai gapgpt مدل هوش مصنوعی'],
            ['name' => 'تنظیمات بیاتو بات', 'url' => route('admin.settings.biata-bot'), 'icon' => 'ti-robot', 'keywords' => 'chatbot چت بات'],
            ['name' => 'گزارشات گفتگو', 'url' => route('admin.biata-bot.chats.index'), 'icon' => 'ti-messages', 'keywords' => 'chat گزارش بیاتو'],
            ['name' => 'تنظیمات تولید محتوا', 'url' => route('admin.settings.content-generation'), 'icon' => 'ti-wand', 'keywords' => 'ai blog محتوا'],
            ['name' => 'تنظیمات اصلی', 'url' => route('admin.settings.main'), 'icon' => 'ti-settings', 'keywords' => 'settings'],
            ['name' => 'تنظیمات ظاهری', 'url' => route('admin.settings.appearance'), 'icon' => 'ti-palette', 'keywords' => 'appearance بنر ظاهر'],
            ['name' => 'تنظیمات سئو', 'url' => route('admin.settings.seo'), 'icon' => 'ti-seo', 'keywords' => 'seo'],
            ['name' => 'اتصال ترب', 'url' => route('admin.settings.torob-api'), 'icon' => 'ti-api', 'keywords' => 'torob api تنظیمات'],
            ['name' => 'روش‌های پرداخت', 'url' => route('admin.settings.payment-methods'), 'icon' => 'ti-credit-card', 'keywords' => 'payment تنظیمات'],
            ['name' => 'درگاه پرداخت زیبال', 'url' => route('admin.settings.zibal'), 'icon' => 'ti-cash', 'keywords' => 'zibal درگاه تنظیمات'],
            ['name' => 'پرداخت کارت به کارت', 'url' => route('admin.settings.card-to-card'), 'icon' => 'ti-credit-card', 'keywords' => 'کارت تنظیمات'],
            ['name' => 'تنظیمات درگاه ترب‌پی', 'url' => route('admin.settings.torobpay'), 'icon' => 'ti-building-store', 'keywords' => 'torobpay'],
            ['name' => 'سفارش‌های ترب‌پی', 'url' => route('admin.settings.torobpay.orders'), 'icon' => 'ti-building-store', 'keywords' => 'torobpay'],
            ['name' => 'تنظیمات درگاه دیجی‌پی', 'url' => route('admin.settings.digipay'), 'icon' => 'ti-building-store', 'keywords' => 'digipay'],
            ['name' => 'سفارش‌های دیجی‌پی', 'url' => route('admin.settings.digipay.orders'), 'icon' => 'ti-building-store', 'keywords' => 'digipay'],
            ['name' => 'روش‌های ارسال', 'url' => route('admin.settings.shipping-methods.index'), 'icon' => 'ti-truck', 'keywords' => 'shipping پست تنظیمات'],
            ['name' => 'تنظیمات آمادست', 'url' => route('admin.settings.amadast'), 'icon' => 'ti-truck-delivery', 'keywords' => 'amadast لجستیک'],
            ['name' => 'تنظیمات ارسال پیامک', 'url' => route('admin.settings.sms-sending'), 'icon' => 'ti-mail-forward', 'keywords' => 'sms template'],
            ['name' => 'تنظیمات پیام متنی', 'url' => route('admin.settings.sms'), 'icon' => 'ti-message', 'keywords' => 'sms پیامک'],
            ['name' => 'انتقال از ووکامرس', 'url' => route('admin.settings.woo-import'), 'icon' => 'ti-download', 'keywords' => 'woo import تنظیمات'],
            ['name' => 'گردونه شانس', 'url' => route('admin.settings.club.wheel'), 'icon' => 'ti-circle-dot', 'keywords' => 'club wheel'],
            ['name' => 'صفحه تماس با ما', 'url' => route('admin.settings.contact-page'), 'icon' => 'ti-phone', 'keywords' => 'contact'],
            ['name' => 'صفحه درباره ما', 'url' => route('admin.settings.about-page'), 'icon' => 'ti-info-circle', 'keywords' => 'about'],
            ['name' => 'صفحه قوانین و مقررات', 'url' => route('admin.settings.terms-page'), 'icon' => 'ti-file-text', 'keywords' => 'terms'],
        ];

        $needle = mb_strtolower($q);

        return collect($pages)
            ->filter(function (array $page) use ($needle) {
                $hay = mb_strtolower($page['name'].' '.($page['keywords'] ?? ''));

                return str_contains($hay, $needle);
            })
            ->take(12)
            ->map(fn (array $page) => [
                'name' => $page['name'],
                'url'  => $page['url'],
                'icon' => $page['icon'],
            ])
            ->values()
            ->all();
    }

    private function searchProducts(string $q): array
    {
        $like = "%{$q}%";

        return Product::query()
            ->where(function ($query) use ($like) {
                $query->where('title', 'like', $like)
                    ->orWhere('title_en', 'like', $like)
                    ->orWhere('slug', 'like', $like)
                    ->orWhere('tags', 'like', $like);
            })
            ->orderByDesc('id')
            ->limit(self::LIMIT)
            ->get(['title', 'slug', 'is_active'])
            ->map(fn (Product $p) => [
                'name'     => $p->title,
                'url'      => route('admin.products.edit', $p),
                'icon'     => 'ti-package',
                'subtitle' => $p->is_active ? 'فعال' : 'غیرفعال',
            ])
            ->all();
    }

    private function searchCategories(string $q): array
    {
        $like = "%{$q}%";

        return ProductCategory::query()
            ->where(function ($query) use ($like) {
                $query->where('name', 'like', $like)
                    ->orWhere('slug', 'like', $like);
            })
            ->orderByDesc('id')
            ->limit(self::LIMIT)
            ->get(['name', 'slug'])
            ->map(fn (ProductCategory $c) => [
                'name' => $c->name,
                'url'  => route('admin.products.categories.edit', $c),
                'icon' => 'ti-category',
            ])
            ->all();
    }

    private function searchOrders(string $q): array
    {
        $like = "%{$q}%";

        return Order::query()
            ->with('user:id,first_name,last_name,mobile')
            ->where(function ($query) use ($like) {
                $query->where('order_number', 'like', $like)
                    ->orWhere('tracking_code', 'like', $like)
                    ->orWhereHas('user', function ($uq) use ($like) {
                        $uq->where('mobile', 'like', $like)
                            ->orWhere('first_name', 'like', $like)
                            ->orWhere('last_name', 'like', $like);
                    });
            })
            ->orderByDesc('id')
            ->limit(self::LIMIT)
            ->get(['id', 'order_number', 'status', 'user_id', 'tracking_code'])
            ->map(function (Order $order) {
                $userName = trim(($order->user->first_name ?? '').' '.($order->user->last_name ?? ''));

                return [
                    'name'     => $order->order_number,
                    'url'      => route('admin.orders.show', $order),
                    'icon'     => 'ti-shopping-cart',
                    'subtitle' => trim(($userName ?: ($order->user->mobile ?? '')).' — '.$order->statusLabel()),
                ];
            })
            ->all();
    }

    private function searchUsers(string $q): array
    {
        $like = "%{$q}%";

        return User::query()
            ->where('role', '!=', 'admin')
            ->where(function ($query) use ($like, $q) {
                $query->where('first_name', 'like', $like)
                    ->orWhere('last_name', 'like', $like)
                    ->orWhere('mobile', 'like', $like)
                    ->orWhereRaw("CONCAT(first_name, ' ', last_name) LIKE ?", [$like]);
            })
            ->orderByDesc('id')
            ->limit(self::LIMIT)
            ->get(['first_name', 'last_name', 'mobile'])
            ->map(fn (User $user) => [
                'name'     => trim($user->first_name.' '.$user->last_name) ?: $user->mobile,
                'url'      => route('admin.users.show', $user),
                'icon'     => 'ti-user',
                'subtitle' => $user->mobile,
            ])
            ->all();
    }

    private function searchBlog(string $q): array
    {
        $like = "%{$q}%";

        return BlogPost::query()
            ->where(function ($query) use ($like) {
                $query->where('title', 'like', $like)
                    ->orWhere('slug', 'like', $like);
            })
            ->orderByDesc('id')
            ->limit(self::LIMIT)
            ->get(['title', 'slug', 'status'])
            ->map(fn (BlogPost $post) => [
                'name'     => $post->title,
                'url'      => route('admin.blog.posts.edit', $post),
                'icon'     => 'ti-article',
                'subtitle' => $post->status === 'published' ? 'منتشر شده' : 'پیش‌نویس',
            ])
            ->all();
    }

    private function searchTickets(string $q): array
    {
        $like = "%{$q}%";

        return Ticket::query()
            ->where(function ($query) use ($like) {
                $query->where('name', 'like', $like)
                    ->orWhere('subject', 'like', $like);
            })
            ->orderByDesc('id')
            ->limit(self::LIMIT)
            ->get(['name', 'subject', 'status'])
            ->map(fn (Ticket $ticket) => [
                'name'     => $ticket->subject,
                'url'      => route('admin.tickets.show', $ticket),
                'icon'     => 'ti-ticket',
                'subtitle' => $ticket->name.' — '.$ticket->statusLabel(),
            ])
            ->all();
    }

    private function normalize(string $value): string
    {
        $value = trim($value);
        $value = strtr($value, [
            '۰' => '0', '۱' => '1', '۲' => '2', '۳' => '3', '۴' => '4',
            '۵' => '5', '۶' => '6', '۷' => '7', '۸' => '8', '۹' => '9',
            '٠' => '0', '١' => '1', '٢' => '2', '٣' => '3', '٤' => '4',
            '٥' => '5', '٦' => '6', '٧' => '7', '٨' => '8', '٩' => '9',
            'ي' => 'ی', 'ك' => 'ک',
        ]);

        return Str::of($value)->squish()->toString();
    }
}
