"use client"; import { useState, useMemo, useEffect } from "react"; import { motion, AnimatePresence } from "motion/react"; import { ArrowRight, Calculator as CalcIcon, ChevronLeft, ShieldCheck, CheckCircle2, Clock, FlaskConical, Stethoscope, Info, CalendarDays, Dog, Gamepad2, X, Plus, Minus, Bell, Sparkles, ChevronRight, ChevronDown, Activity, Heart, Zap, Flame, Star, Users, ShoppingBag } from "lucide-react"; const ICON_MAP: Record = { Sparkles, Activity, ShieldCheck, Heart, Zap, Flame, Star, Users }; import { toPersian, cn } from "../lib/utils"; import { Product, PRODUCTS } from "../lib/data/products"; import { productService } from "../lib/services/productService"; import { SCIENTIFIC_TERMS } from "../lib/data/scientificTerms"; import { useSettingsStore } from "../lib/store/settingsStore"; import { create } from "zustand"; import { useCartStore } from "../lib/store/cartStore"; import { usePetStore } from "../lib/store/usePetStore"; import { toast } from "sonner"; interface CalculatorState { petType: "young" | "adult"; weight: number; setPetType: (type: "young" | "adult") => void; setWeight: (weight: number) => void; } const useCalculatorStore = create((set) => ({ petType: "young", weight: 10, setPetType: (petType) => set({ petType }), setWeight: (weight) => set({ weight }), })); import Tooltip from "./Tooltip"; import SafeImage from "./SafeImage"; import { useRouter } from 'next/navigation'; export default function ProductPage({ productSlug }: { productSlug: string }) { const router = useRouter(); const [product, setProduct] = useState(null); const [isLoading, setIsLoading] = useState(true); const [activeTab, setActiveTab] = useState<"specs" | "feeding" | "notes">("specs"); const [showRefillModal, setShowRefillModal] = useState(false); const [itemQuantity, setItemQuantity] = useState(1); const [allProducts, setAllProducts] = useState([]); const [isMounted, setIsMounted] = useState(false); useEffect(() => { setIsMounted(true); productService.getProducts({ limit: 999 }) .then((res) => { const products = res.data; setAllProducts(products); const found = products.find(p => p.slug === productSlug || p.id === productSlug); setProduct(found || null); }) .catch(err => console.error("Error fetching products in ProductPage:", err)) .finally(() => setIsLoading(false)); }, [productSlug]); const { pets, getActivePet } = usePetStore(); const activePet = getActivePet(); const { petType, weight, setPetType, setWeight } = useCalculatorStore(); const { addItem } = useCartStore(); const scientificTerms = useSettingsStore(state => state.scientificTerms); const termKeys = useMemo(() => { return Array.from(new Set([ ...Object.keys(scientificTerms), ...Object.keys(SCIENTIFIC_TERMS) ])); }, [scientificTerms]); // Re-hydrate product to ensure methods like calculateDosage exist const fullProduct = useMemo(() => { if (!product) return null; const apiProduct = allProducts.find(p => p.id === product.id) || product; if (!apiProduct) return null; const staticProduct = PRODUCTS.find(p => p.id === apiProduct.id || p.artNo === apiProduct.artNo); if (staticProduct) { return { ...apiProduct, calculateDosage: staticProduct.calculateDosage }; } if (typeof apiProduct.calculateDosage !== 'function') { return { ...apiProduct, calculateDosage: (w: number, y: boolean) => { return { quantity: 1, unit: apiProduct.unit || "قرص", description: "مصرف روزانه بر اساس دستور پزشک" }; } }; } return apiProduct; }, [product, allProducts]); useEffect(() => { if (activePet) { setWeight(activePet.weight); setPetType(activePet.age <= 1 ? "young" : "adult"); } }, [activePet, setWeight, setPetType]); const calculation = useMemo(() => { if (!fullProduct || typeof fullProduct.calculateDosage !== 'function') return null; const result = fullProduct.calculateDosage(weight, petType === "young"); const duration = Math.floor(fullProduct.packageSize / result.quantity); return { dailyDose: result.quantity, duration: duration || 0, unit: result.unit, description: result.description }; }, [fullProduct, petType, weight]); // Suggest quantity inside useEffect to avoid render-phase state update useEffect(() => { const duration = calculation?.duration ?? 0; const suggestedQty = (duration < 30 && duration > 0) ? 2 : 1; setItemQuantity(suggestedQty); }, [calculation?.duration]); if (isLoading) return
Loading...
; if (!product || !fullProduct || !calculation) return
محصول یافت نشد
; return (
{/* Mobile Header with Back Button */}
کانینا ایران
{/* Breadcrumbs */} {/* Global Single Grid Layout - Aligns Sticky Buy Box at the Top */}
{/* Right/Main Content Column (lg:col-span-8) */}
{/* Above the Fold Grid */}
{/* Right Column: Product Image Frame (md:col-span-5) */}
موجود در انبار
گرید دارویی اختصاصی
{/* Left Column: Product Title & Description (md:col-span-7) */}
استاندارد صنعتی آلمان
{product.specialBadge && (
{product.specialBadge}
)}

{product.nameFa || product.name}

{product.nameEn && (

{product.nameEn}

)}

{isMounted && pets.length > 0 ? ( product.optimisticTemplate?.replace("[PetName]", activePet?.name || "").replace("[OnSet]", product.onSetOfAction || "به زودی") ) : ( product.scientificTagline )}

{fullProduct.shortDescription && (

{fullProduct.shortDescription}

)}
{/* ─── Symptoms / Therapeutic Indications Section ─── */} {fullProduct.symptoms && fullProduct.symptoms.length > 0 && (

علائم و موارد درمانی مرتبط

این محصول برای رفع علائم زیر توسط دامپزشکان توصیه می‌شود:

{fullProduct.symptoms.map((symptom: string, idx: number) => ( {symptom} ))}
)} {/* Key Benefits Section */} {fullProduct.keyBenefits && fullProduct.keyBenefits.length > 0 && (

چرا {fullProduct.name}؟

{fullProduct.keyBenefits.map((benefit, i) => { const Icon = ICON_MAP[benefit.icon] || CheckCircle2; return (

{benefit.title}

{benefit.description}

); })}
)} {/* Comprehensive Product Description Section (Below the fold) */} {fullProduct.description && (

توضیحات و معرفی محصول

{fullProduct.description.split('\n').filter(Boolean).map((para, pIdx) => (

{para.trim()}

))}
)} {/* Smart Dosage Calculator Utility Section */}

ماشین حساب هوشمند مصرف

تخمین دقیق دوز روزانه و ماندگاری هر بسته بر اساس مشخصات پت شما

{/* Manual Slider Inputs */}
وزن پت (کیلوگرم) {toPersian(weight)} ک‌گ
setWeight(parseInt(e.target.value))} className="w-full h-2 bg-medical-gray-200 rounded-lg appearance-none cursor-pointer accent-canina-blue [&::-webkit-slider-thumb]:w-6 [&::-webkit-slider-thumb]:h-6 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-canina-blue [&::-webkit-slider-thumb]:appearance-none" />
سن حیوان
{/* Calculation Results Output */}
تخمین هوش مصنوعی (AI Advice)
{toPersian(calculation.duration)} روز
تخمین اتمام مصرف بسته
{toPersian(calculation.dailyDose)}
دوز روزانه ({calculation.unit === 'g' ? 'گرم' : calculation.unit})

* دوزها تخمینی هستند؛ توصیه می‌شود برای مصرف دقیق کاتالوگ محصول را مطالعه کنید.

{/* Ingredients Section */}

ترکیبات و آنالیز علمی

{/* Ingredients Cards */}

مواد تشکیل‌دهنده برتر

{product.main_ingredients.map((ing, idx) => { const termKey = termKeys.find(key => { const termObj = scientificTerms[key] || SCIENTIFIC_TERMS[key]; const termName = termObj?.term || key; const ingClean = ing.toLowerCase(); const keyClean = key.toLowerCase(); const termNameClean = termName.toLowerCase(); return ingClean.includes(keyClean) || keyClean.includes(ingClean) || ingClean.includes(termNameClean) || termNameClean.includes(ingClean); }); return (
{termKey ? ( router.push(`/wiki?term=${id}`)}> {ing} ) : ing}
); })}
{/* Analysis Cards Grid */} {Object.keys(product.analysis).length > 0 && (
تخمین اتمام بسته (هوش مصنوعی)
{Object.entries(product.analysis).map(([key, value]) => (
{key}
{toPersian(value)}
))}
)}
{/* Feeding / Usage Instructions Section (Dynamic Header based on product category) */}

{product.categorySlug === 'special-care' || product.name.toLowerCase().includes('pfotenpflege') || product.name.toLowerCase().includes('augenpflege') ? 'دستورالعمل و نحوه استفاده موضعی' : 'توصیه غذایی و نحوه مصرف'}

{product.feedingAdvice}

{/* Specialist Note */} {product.specialist && (
{product.specialist.name}
مورد تأیید دامپزشکان

{product.specialist.name}

{product.specialist.title}

"{product.specialist.message}"

)} {/* Specialized Landing Banner */}
toast.info("بزودی: صفحه فرود تخصصی این محصول در حال آماده‌سازی است")} >

مشاهده بررسی تخصصی و نتایج درمانی

گزارش‌های علمی، ویدیوهای آموزشی و تجربیات واقعی دیگر صاحبان پت در لندینگ‌پیج اختصاصی این محصول.

ورود به آزمایشگاه علمی
{/* FAQ Section */} {product.faqs && product.faqs.length > 0 && (

پاسخ به ابهامات شما

{product.faqs.map((faq, i) => (
{faq.question}
{faq.answer}
))}
)}
{/* Sticky Sidebar (Clean Buy Box) - Sticky starts at the top, level with the title */}
قیمت نهایی محصول
{toPersian(product.price)}
{/* Quantity Selector - 40% Width */}
{toPersian(itemQuantity)}
{/* Add to Cart Button - 60% Width */}
ضمانت اصالت محصول (Made in Germany)
آماده ارسال (تحویل حداکثر ۴۸ ساعت)
{/* expected results box */} {product.expectedResults && product.expectedResults.length > 0 && (

تغییرات قابل انتظار

{product.expectedResults.map((res, i) => { const Icon = ICON_MAP[res.icon] || Sparkles; return (
{res.text}
); })}
)}
{/* Smart Cross-sell: Recommended Combinations */} {product.relatedProducts && product.relatedProducts.length > 0 && (
فرمولاسیون ترکیبی هم‌افزا (Synergy Blend)

اثربخشی دوبرابر با ترکیب هوشمند

{product.relatedProducts.map(relId => { const relProduct = allProducts.find(p => p.id === relId); if (!relProduct) return null; return ( router.push(`/shop/${relProduct.id}`)} >

{relProduct.name}

{relProduct.description}

{relProduct.price}
مشاهده محصول مکمل
); })}
)}
{/* Refill Automation Popup */} {showRefillModal && (
setShowRefillModal(false)} className="absolute inset-0 bg-medical-gray-900/60 backdrop-blur-md" />

سیستم یادآوری هوشمند

بر اساس وزن {toPersian(weight)} کیلوگرمی {activePet ? `برای ${activePet.name}` : 'سگ شما'}، این بسته {toPersian(product.packageSize)} تایی دقیقاً {toPersian(calculation.duration)} روز دیگر تمام می‌شود.

آیا مایلید سیستم ۵ روز قبل از اتمام، به شما پیامک یادآوری ارسال کند؟
)}
); }