<?php

namespace App\Services;

use App\Models\PricingTier;
use App\Models\Product;

class PricingService
{
    /**
     * احسب سعر الوحدة بناءً على إجمالي كمية المنتج الأب في السلة.
     * المنطق: نجمع كميات كل الـ variants التابعة لنفس المنتج الأب،
     * ثم نطابق الإجمالي مع الشريحة السعرية المناسبة.
     */
    public function calculateUnitPrice(Product $product, int $totalQty): float
    {
        $tier = $this->getApplicableTier($product, $totalQty);

        if (! $tier) {
            $firstTier = $product->pricingTiers()->orderBy('min_qty')->first();
            return $firstTier ? (float) $firstTier->unit_price : 0;
        }

        return (float) $tier->unit_price;
    }

    /**
     * أوجد الشريحة السعرية المطابقة لكمية معينة.
     */
    public function getApplicableTier(Product $product, int $totalQty): ?PricingTier
    {
        return $product->pricingTiers()
            ->where('min_qty', '<=', $totalQty)
            ->where(function ($query) use ($totalQty) {
                $query->where('max_qty', '>=', $totalQty)
                      ->orWhereNull('max_qty');
            })
            ->first();
    }

    /**
     * من مصفوفة عناصر السلة (cart items)، احسب سعر الوحدة لكل عنصر
     * بناءً على إجمالي الكمية لكل منتج أب.
     *
     * @param array $cartItems  [['variant_id' => int, 'quantity' => int, 'product_id' => int], ...]
     * @return array            [variant_id => ['unit_price' => float, 'tier' => ?PricingTier]]
     */
    public function calculateCartPrices(array $cartItems): array
    {
        $qtyByProduct = [];
        foreach ($cartItems as $item) {
            $productId = $item['product_id'];
            $qtyByProduct[$productId] = ($qtyByProduct[$productId] ?? 0) + $item['quantity'];
        }

        $products = Product::with('pricingTiers')
            ->whereIn('id', array_keys($qtyByProduct))
            ->get()
            ->keyBy('id');

        $result = [];
        foreach ($cartItems as $item) {
            $product = $products->get($item['product_id']);
            if (! $product) {
                continue;
            }

            $totalQty = $qtyByProduct[$item['product_id']];
            $unitPrice = $this->calculateUnitPrice($product, $totalQty);
            $tier = $this->getApplicableTier($product, $totalQty);

            $result[$item['variant_id']] = [
                'unit_price' => $unitPrice,
                'tier' => $tier,
                'product_total_qty' => $totalQty,
            ];
        }

        return $result;
    }

    /**
     * احسب إجمالي الكمية لمنتج أب معين من عناصر السلة.
     */
    public function getProductTotalQty(int $productId, array $cartItems): int
    {
        $total = 0;
        foreach ($cartItems as $item) {
            if ($item['product_id'] === $productId) {
                $total += $item['quantity'];
            }
        }
        return $total;
    }
}
