<?php

namespace App\Http\Controllers\Frontend;

use App\Http\Controllers\Controller;
use App\Models\Cart;
use App\Models\Product;
use App\Models\ProductVariation;
use App\Services\MetaConversionsService;
use Illuminate\Http\Request;

class CartController extends Controller
{
    private function getSessionId(): string
    {
        return session()->getId();
    }

    public function index()
    {
        $cartItems = Cart::with(['product', 'variation'])
            ->where('session_id', $this->getSessionId())
            ->get();

        $total = $cartItems->sum(function ($item) {
            $price = $item->product->current_price + ($item->variation?->price_adjustment ?? 0);
            return $price * $item->quantity;
        });

        return view('frontend.cart', compact('cartItems', 'total'));
    }

    public function add(Request $request)
    {
        $request->validate([
            'product_id'   => 'required|exists:products,id',
            'variation_id' => 'nullable|exists:product_variations,id',
            'quantity'     => 'required|integer|min:1',
        ]);

        $sessionId   = $this->getSessionId();
        $productId   = $request->product_id;
        $variationId = $request->variation_id;
        $qty         = $request->quantity;

        $existing = Cart::where('session_id', $sessionId)
            ->where('product_id', $productId)
            ->where('variation_id', $variationId)
            ->first();

        if ($existing) {
            $existing->increment('quantity', $qty);
        } else {
            Cart::create([
                'session_id'   => $sessionId,
                'product_id'   => $productId,
                'variation_id' => $variationId,
                'quantity'     => $qty,
            ]);
        }

        // Server-side AddToCart event
        $product = Product::find($productId);
        if ($product) {
            $price = (float) ($product->sale_price ?? $product->regular_price ?? 0);
            app(MetaConversionsService::class)->sendAddToCart(
                $productId, $product->name, $price, $qty
            );
        }

        if ($request->ajax()) {
            return response()->json(['success' => true, 'cart_count' => $this->cartCount()]);
        }

        return back()->with('success', 'Added to cart!');
    }

    public function update(Request $request, Cart $cart)
    {
        $request->validate(['quantity' => 'required|integer|min:1']);
        $cart->update(['quantity' => $request->quantity]);
        return redirect()->route('cart')->with('success', 'Cart updated.');
    }

    public function remove(Cart $cart)
    {
        $cart->delete();
        return redirect()->route('cart')->with('success', 'Item removed.');
    }

    private function cartCount(): int
    {
        return Cart::where('session_id', $this->getSessionId())->sum('quantity');
    }
}
