import { defineStore } from 'pinia' import { ref, computed } from 'vue' export interface CartItem { id: number productId: number name: string image: string price: number quantity: number product_number: string } export interface DeliveryMethod { id: number name: string price: number description: string } export interface Cart { id: string name: string items: CartItem[] } export const useCartStore = defineStore('cart', () => { const carts = ref([]) const activeCartId = ref(null) const selectedAddressId = ref(null) const selectedDeliveryMethodId = ref(null) const shippingCost = ref(0) const vatRate = ref(0.23) // 23% VAT const currentPage = ref(1) const deliveryMethods = ref([ { id: 1, name: 'Standard Delivery', price: 0, description: '5-7 business days' }, { id: 2, name: 'Express Delivery', price: 15, description: '2-3 business days' }, { id: 3, name: 'Priority Delivery', price: 30, description: 'Next business day' } ]) const items = computed(() => { if (!activeCartId.value) return [] const cart = carts.value.find(c => c.id === activeCartId.value) return cart ? cart.items : [] }) const activeCart = computed(() => { return carts.value.find(c => c.id === activeCartId.value) || null }) const productsTotal = computed(() => { return items.value.reduce((sum, item) => sum + (item.price * item.quantity), 0) }) const vatAmount = computed(() => { return productsTotal.value * vatRate.value }) const orderTotal = computed(() => { return productsTotal.value + shippingCost.value + vatAmount.value }) const itemCount = computed(() => { return items.value.reduce((sum, item) => sum + item.quantity, 0) }) function createCart(name: string): Cart { const newCart: Cart = { id: `cart-${Date.now()}`, name, items: [] } carts.value.push(newCart) activeCartId.value = newCart.id return newCart } function deleteCart(cartId: string) { const index = carts.value.findIndex(c => c.id === cartId) if (index !== -1) { carts.value.splice(index, 1) if (activeCartId.value === cartId) { const firstCart = carts.value[0] activeCartId.value = firstCart ? firstCart.id : null } } } function renameCart(cartId: string, newName: string) { const cart = carts.value.find(c => c.id === cartId) if (cart) { cart.name = newName } } function setActiveCart(cartId: string) { const cart = carts.value.find(c => c.id === cartId) if (cart) { activeCartId.value = cartId } } function addItemToActiveCart(item: CartItem) { if (!activeCartId.value) { createCart('Cart 1') } const cart = carts.value.find(c => c.id === activeCartId.value) if (cart) { const existingItem = cart.items.find(i => i.productId === item.productId) if (existingItem) { existingItem.quantity += item.quantity } else { cart.items.push(item) } } } function updateQuantity(itemId: number, quantity: number) { const cart = carts.value.find(c => c.id === activeCartId.value) if (!cart) return const item = cart.items.find(i => i.id === itemId) if (item) { if (quantity <= 0) { removeItem(itemId) } else { item.quantity = quantity } } } function deleteProduct(id: number): boolean { const cart = carts.value.find(c => c.id === activeCartId.value) if (!cart) return false const index = cart.items.findIndex(a => a.id === id) if (index === -1) return false cart.items.splice(index, 1) resetProductPagination() return true } function resetProductPagination() { currentPage.value = 1 } function removeItem(itemId: number) { const cart = carts.value.find(c => c.id === activeCartId.value) if (!cart) return const index = cart.items.findIndex(i => i.id === itemId) if (index !== -1) { cart.items.splice(index, 1) } } function clearCart() { const cart = carts.value.find(c => c.id === activeCartId.value) if (cart) { cart.items = [] } selectedAddressId.value = null selectedDeliveryMethodId.value = null shippingCost.value = 0 } function setSelectedAddress(addressId: number | null) { selectedAddressId.value = addressId } function setDeliveryMethod(methodId: number) { selectedDeliveryMethodId.value = methodId const method = deliveryMethods.value.find(m => m.id === methodId) if (method) { shippingCost.value = method.price } } function initMockData() { const cart1: Cart = { id: 'cart-1', name: 'Cart 1', items: [ { id: 1, productId: 101, name: 'Premium Widget Pro', product_number: 'NC209/7000', image: '/img/product-1.jpg', price: 129.99, quantity: 2 }, { id: 2, productId: 102, name: 'Ultra Gadget X', product_number: 'NC234/6453', image: '/img/product-2.jpg', price: 89.50, quantity: 1 } ] } const cart2: Cart = { id: 'cart-2', name: 'Cart 2', items: [ { id: 3, productId: 103, name: 'Mega Tool Set', product_number: 'NC324/9030', image: '/img/product-3.jpg', price: 249.00, quantity: 3 } ] } const cart3: Cart = { id: 'cart-3', name: 'Cart 3', items: [] } carts.value = [cart1, cart2, cart3] activeCartId.value = 'cart-1' } initMockData() return { carts, activeCartId, activeCart, items, selectedAddressId, selectedDeliveryMethodId, shippingCost, vatRate, deliveryMethods, productsTotal, vatAmount, orderTotal, itemCount, createCart, deleteCart, renameCart, setActiveCart, addItemToActiveCart, updateQuantity, deleteProduct, removeItem, clearCart, setSelectedAddress, setDeliveryMethod } })