<?php
/**
 * CartService
 * Handles user shopping cart business logic, variations, dynamic pricing and stock validations
 */

require_once __DIR__ . '/../Models/Cart.php';
require_once __DIR__ . '/../Models/Product.php';

class CartService {
    private Cart $cartModel;
    private Product $productModel;

    public function __construct() {
        $this->cartModel = new Cart();
        $this->productModel = new Product();
    }

    public function getCart(int $userId): array {
        return $this->cartModel->getCartItemsGrouped($userId);
    }

    public function getCartCount(int $userId): int {
        return $this->cartModel->getCartItemCount($userId);
    }

    public function addItem(int $userId, int $productId, int $quantity = 1, ?string $variationSummary = null, ?float $unitPrice = null, ?int $skuId = null): array {
        $product = $this->productModel->findById($productId);
        if (!$product || $product['status'] !== 'active' || !empty($product['deleted_at'])) {
            return ['success' => false, 'message' => 'สินค้านี้ไม่พร้อมจำหน่าย'];
        }

        $availableStock = (int)$product['stock'];
        if ($availableStock <= 0) {
            return ['success' => false, 'message' => 'สินค้าหมด'];
        }

        $cart = $this->cartModel->getOrCreateCart($userId);
        $cartId = (int)$cart['id'];

        $quantity = max(1, min($quantity, $availableStock));

        // If unitPrice not specified, fallback to product base price
        if ($unitPrice === null || $unitPrice <= 0) {
            $unitPrice = (float)$product['price'];
        }

        $this->cartModel->addItem($cartId, $productId, $quantity, $variationSummary, $unitPrice, $skuId);

        $cartCount = $this->cartModel->getCartItemCount($userId);

        return [
            'success' => true,
            'message' => 'เพิ่มสินค้าลงในรถเข็นเรียบร้อยแล้ว',
            'cart_count' => $cartCount
        ];
    }

    public function updateQuantity(int $userId, int $itemIdOrProductId, int $quantity): array {
        $cart = $this->cartModel->getOrCreateCart($userId);
        $cartId = (int)$cart['id'];

        $quantity = max(0, $quantity);

        $this->cartModel->updateQuantity($cartId, $itemIdOrProductId, $quantity);
        $cartData = $this->cartModel->getCartItemsGrouped($userId);

        return [
            'success' => true,
            'cart' => $cartData
        ];
    }

    public function removeItem(int $userId, int $itemIdOrProductId): array {
        $cart = $this->cartModel->getOrCreateCart($userId);
        $this->cartModel->removeItem((int)$cart['id'], $itemIdOrProductId);
        $cartData = $this->cartModel->getCartItemsGrouped($userId);

        return [
            'success' => true,
            'message' => 'ลบสินค้าออกจากรถเข็นแล้ว',
            'cart' => $cartData
        ];
    }

    public function toggleSelect(int $userId, int $itemIdOrProductId, bool $isSelected): array {
        $cart = $this->cartModel->getOrCreateCart($userId);
        $this->cartModel->toggleSelect((int)$cart['id'], $itemIdOrProductId, $isSelected);
        $cartData = $this->cartModel->getCartItemsGrouped($userId);

        return [
            'success' => true,
            'cart' => $cartData
        ];
    }
}
