import type { Product } from '@/models/products' import { getTradeBuyPrice, getTradeSellPrice, lastPrice } from '@/utils/price' /** * قیمت‌گیری ماژولار محصول در حالت فروشگاهی (is_store=true). * * منبع حقیقت قیمت و وضعیت نمایش، سرور است: `/customer/product/list` و رویداد SSE * `list` هر دو قیمت هر محصول (`price`/`price_profit`) و `show` را محاسبه‌شده می‌فرستند. * این ماژول فقط همان قیمت سرور را می‌خواند و فقط برای آبشده وقتی قیمت سرور صفر است * به قیمت زندهٔ مرجع (`lastPrice`) fallback می‌کند — هیچ‌جا قیمت سرور بازنویسی نمی‌شود. */ const MELTED_GROUP = 'آبشده' export function isMeltedProduct(product?: Product | null): boolean { return product?.group_type === MELTED_GROUP } /** قیمت پایهٔ خرید (بدون کارمزد) — قیمت سرور، با fallback زندهٔ آبشده وقتی سرور صفر است */ export function getProductBaseBuyPrice(product?: Product | null): number { if (!product) { return 0 } const serverPrice = Number(product.price ?? 0) if (serverPrice > 0) { return serverPrice } if (isMeltedProduct(product)) { const liveBuy = getTradeBuyPrice(lastPrice.value) if (liveBuy > 0) { const amount = Number(product.amount ?? 0) return amount > 0 ? liveBuy * amount : liveBuy } } return 0 } /** قیمت خرید نمایشی محصول (همان مقداری که در لیست و صفحهٔ محصول نشان داده می‌شود) */ export function getProductBuyPrice(product?: Product | null): number { const base = getProductBaseBuyPrice(product) if (base <= 0) { return 0 } return base + Number(product?.cash_fee_buy ?? 0) } /** قیمت پایهٔ فروش (بدون کارمزد) — قیمت فروش سرور، با fallback زندهٔ آبشده */ export function getProductBaseSellPrice(product?: Product | null): number { if (!product) { return 0 } const serverSell = Number(product.sellPrice ?? 0) if (serverSell > 0) { return serverSell } if (isMeltedProduct(product)) { const liveSell = getTradeSellPrice(lastPrice.value) if (liveSell > 0) { const amount = Number(product.amount ?? 0) return amount > 0 ? liveSell * amount : liveSell } } return getProductBaseBuyPrice(product) } /** قیمت فروش نمایشی محصول */ export function getProductSellPrice(product?: Product | null): number { const base = getProductBaseSellPrice(product) if (base <= 0) { return 0 } return base - Number(product?.cash_fee_sell ?? 0) } /** محصول وقتی قیمت پایهٔ معتبری ندارد، غیرفعال (غیرقابل معامله) است */ export function isProductPriceInactive(product?: Product | null): boolean { return getProductBaseBuyPrice(product) <= 0 } /** * نمایش محصول در فروشگاه — اولویت با `show` سرور. * فقط برای آبشده‌ای که قیمت سرورش هنوز نرسیده، با قیمت زنده تکمیل می‌کنیم. */ export function isProductVisible(product?: Product | null): boolean { if (!product || product.active === false) { return false } if (product.show) { return true } // سازگاری: آبشده‌ای که سرور هنوز قیمت نداده ولی قیمت زنده موجود است return isMeltedProduct(product) && getProductBaseBuyPrice(product) > 0 }