<?php

namespace App\View\Composers;

use App\Models\Announcement;
use App\Models\Cart;
use App\Models\Category;
use App\Models\Wishlist;
use Illuminate\Support\Facades\Cache;
use Illuminate\View\View;

class LayoutComposer
{
    /**
     * Bind data to the view.
     */
    public function compose(View $view): void
    {
        // Cache announcements for 10 minutes
        $announcements = Cache::remember('layout.announcements', 600, function () {
            return Announcement::active()->ordered()->get();
        });

        // Cache menu categories for 10 minutes
        $menuCategories = Cache::remember('layout.menu_categories', 600, function () {
            return Category::active()
                ->root()
                ->orderBy('sort_order')
                ->take(10)
                ->get();
        });

        // Cache cart count per user (5 minutes cache)
        $cartItemCount = 0;
        if (auth()->check()) {
            $cartItemCount = Cache::remember("layout.cart_count." . auth()->id(), 300, function () {
                $cart = Cart::where('user_id', auth()->id())->first();
                if (!$cart) {
                    return 0;
                }
                // Use direct query for more reliable count calculation
                return \App\Models\CartItem::where('cart_id', $cart->id)->sum('qty') ?: 0;
            });
        } else {
            // Handle guest cart count using cookie_token
            $cookieToken = request()->cookie('cart_token');
            if ($cookieToken) {
                $cartItemCount = Cache::remember("layout.cart_count.guest." . $cookieToken, 300, function () use ($cookieToken) {
                    $cart = Cart::where('cookie_token', $cookieToken)
                        ->whereNull('user_id')
                        ->first();
                    if (!$cart) {
                        return 0;
                    }
                    // Use direct query for more reliable count calculation
                    return \App\Models\CartItem::where('cart_id', $cart->id)->sum('qty') ?: 0;
                });
            }
        }

        // Cache wishlist count per user (5 minutes cache)
        $wishlistCount = 0;
        if (auth()->check()) {
            try {
                $wishlistCount = Cache::remember("layout.wishlist_count." . auth()->id(), 300, function () {
                    return Wishlist::where('user_id', auth()->id())->count();
                });
            } catch (\Illuminate\Database\QueryException $e) {
                // If table doesn't exist, set count to 0
                if (str_contains($e->getMessage(), "doesn't exist")) {
                    $wishlistCount = 0;
                } else {
                    throw $e;
                }
            }
        }

        // Share data with all views
        $view->with([
            'announcements' => $announcements,
            'menuCategories' => $menuCategories,
            'cartItemCount' => $cartItemCount,
            'wishlistCount' => $wishlistCount,
        ]);
    }
}

