"use client"; import React, { useState, useMemo, useEffect } from "react"; import { Product, PetType } from "../lib/data/products"; import { productService } from "../lib/services/productService"; import { motion, AnimatePresence } from "motion/react"; import { PetProfileSkeleton } from "./Skeleton"; import { Dog, Cat, ChevronRight, ChevronLeft, Heart, Activity, Weight, Calendar, ShieldCheck, Stethoscope, Plus, Clock, ClipboardList, Package, Flame, Star, Users, Edit3, Trash2, AlertTriangle, ArrowRight, TrendingUp, Check, Sparkles, Beaker, HelpCircle, FileText } from "lucide-react"; import { usePetStore, PetProfile as GlobalPetProfile, Reminder, HealthLog, PetConsumption } from "../lib/store/usePetStore"; import { useCartStore } from "../lib/store/cartStore"; import SafeImage from "./SafeImage"; import SmartAdvisor from "./SmartAdvisor"; import { toast } from "sonner"; import { toPersian, cn } from "../lib/utils"; import api from "../lib/services/api"; import { useRouter } from 'next/navigation'; export default function PetProfile({ initialView, advisorNeed }: { initialView?: "index" | "detail" | "add" | "edit", advisorNeed?: string | null }) { const router = useRouter(); const { pets, activePetId, addPet, removePet, setActivePet, getActivePet, updatePet, addReminder, toggleReminder, addHealthLog } = usePetStore(); const { orders } = useCartStore(); const activePet = getActivePet(); const [isLoading, setIsLoading] = useState(true); const [products, setProducts] = useState([]); useEffect(() => { productService.getProducts({ limit: 999 }) .then(res => setProducts(res.data)) .catch(err => console.error("Error fetching products in PetProfile:", err)); }, []); useEffect(() => { const timer = setTimeout(() => setIsLoading(false), 800); return () => clearTimeout(timer); }, []); const [view, setView] = useState<"index" | "detail" | "add" | "edit">(initialView || (pets.length > 0 ? "index" : "add")); useEffect(() => { if (initialView) { setView(initialView); } }, [initialView]); const [activePetTab, setActivePetTab] = useState<"health" | "orders">("health"); const [petToDelete, setPetToDelete] = useState(null); // Modal states const [isAddingReminder, setIsAddingReminder] = useState(false); const [isAddingHealthLog, setIsAddingHealthLog] = useState(false); // New Reminder form state const [reminderForm, setReminderForm] = useState>({ title: "", time: "08:00", frequency: "روزانه", productId: "" }); // Health log form state const [logForm, setLogForm] = useState>({ appetite: "عالی", energy: "نرمال", digestion: "نرمال", note: "" }); const petOrders = useMemo(() => { if (!activePet) return []; return orders.filter(o => o.petId === activePet.id); }, [activePet, orders]); const [step, setStep] = useState(1); const [formData, setFormData] = useState>({ name: "", type: "سگ", breed: "", age: 0, weight: 0, activityLevel: "متوسط", medicalConditions: [], reminders: [], logs: [], consumptions: [] }); const recommendedProducts = useMemo(() => { if (!activePet || products.length === 0) return []; const picks: { product: Product, reason?: string }[] = []; // Priority 1: Match activePet.medicalConditions directly against product.symptoms if (activePet.medicalConditions && activePet.medicalConditions.length > 0) { products.forEach(p => { if (p.suitableFor !== activePet.type && p.suitableFor !== "هر دو") return; const matchedSymptoms = (p.symptoms || []).filter(s => activePet.medicalConditions.some(mc => mc.includes(s) || s.includes(mc)) ); if (matchedSymptoms.length > 0 && !picks.some(x => x.product.id === p.id)) { picks.push({ product: p, reason: `پیشنهاد هوشمند برای تسکین ${matchedSymptoms.join(" و ")}` }); } }); } // Priority 2: Biological factors if (activePet.age > 7) { const heart = products.find(p => p.id === "herz-vital" || p.slug?.includes("herz")); if (heart && !picks.some(x => x.product.id === heart.id)) { picks.push({ product: heart, reason: "محافظت از قلب پت‌های مسن" }); } } // Fill defaults if needed if (picks.length < 4) { const defaults = products.filter(p => !picks.some(x => x.product.id === p.id) && (p.suitableFor === activePet.type || p.suitableFor === "هر دو")); defaults.slice(0, 4 - picks.length).forEach(p => picks.push({ product: p })); } return picks; }, [activePet, products]); const handleNext = () => setStep(s => s + 1); const handleBackStep = () => setStep(s => s - 1); const handleSubmit = () => { if (view === "edit" && activePet) { updatePet(activePet.id, formData); toast.success("اطلاعات شناسنامه با موفقیت بروزرسانی شد"); setView("detail"); } else { addPet(formData); toast.success("شناسنامه جدید با موفقیت صادر شد"); setView("detail"); } setStep(1); }; const handleHealthLogSubmit = () => { if (activePet) { addHealthLog(activePet.id, logForm); toast.success("گزارش سلامت با موفقیت ثبت شد"); setIsAddingHealthLog(false); setLogForm({ appetite: "عالی", energy: "نرمال", digestion: "نرمال", note: "" }); } }; const handleReminderSubmit = () => { if (activePet) { if (!reminderForm.title) { toast.error("لطفاً عنوان یادآور را وارد کنید"); return; } addReminder(activePet.id, reminderForm); toast.success("یادآور با موفقیت ثبت شد"); setIsAddingReminder(false); setReminderForm({ title: "", time: "08:00", frequency: "روزانه", productId: "" }); } }; const handleToggleReminder = (reminder: Reminder) => { if (activePet) { const today = new Date().toISOString().split('T')[0]; toggleReminder(activePet.id, reminder.id, today); const isCompleting = !reminder.completedDates.includes(today); if (isCompleting) { toast.success(`دوز ${reminder.title} تایید شد`); } } }; const startEdit = () => { if (activePet) { setFormData({ name: activePet.name, type: activePet.type, breed: activePet.breed, age: activePet.age, weight: activePet.weight, activityLevel: activePet.activityLevel, medicalConditions: activePet.medicalConditions, reminders: activePet.reminders || [], logs: activePet.logs || [], consumptions: activePet.consumptions || [] }); setView("edit"); setStep(1); } }; const confirmDelete = (pet: GlobalPetProfile) => { setPetToDelete(pet); }; const handlePetDelete = () => { if (petToDelete) { removePet(petToDelete.id); toast.error(`شناسنامه ${petToDelete.name} حذف شد`); setPetToDelete(null); if (pets.length <= 1) { setView("add"); } else { setView("index"); } } }; if (isLoading && view === "detail" && activePet) { return (
); } // 1. Pet Index Page if (view === "index") { return (

همدم‌های من

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

{pets.map(pet => (
{pet.type === "سگ" ? : }

{pet.name}

{pet.breed}

وزن {toPersian(pet.weight)} کیلوگرم
سن {toPersian(pet.age)} سال
))}
{/* Delete Confirmation Modal */} {petToDelete && (
setPetToDelete(null)} />

حذف شناسنامه {petToDelete.name}؟

آیا از حذف شناسنامه {petToDelete.name} اطمینان دارید؟ این عمل غیرقابل بازگشت است و تمام سوابق سلامت او حذف خواهد شد.

)}
); } // 2. Add / Edit Pet Steps if (view === "add" || view === "edit") { if (view === "add" && pets.length === 0) { return (
{/* Render SmartAdvisor directly without redundant top banner */} { const newPet: any = { ...data, id: Date.now().toString(), reminders: [], logs: [], consumptions: [] }; addPet(newPet); setActivePet(newPet.id); toast.success(`شناسنامه سلامت ${data.name} با موفقیت صادر شد`); setView("detail"); }} />
); } return (
{/* Progress Bar */}

{view === "edit" ? "ویرایش شناسنامه" : "صدور شناسنامه سلامت"}

مرحله {toPersian(step)} از {toPersian(3)}: بروزرسانی اطلاعات تخصصی

{step === 1 && (
setFormData({ ...formData, name: e.target.value })} className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl py-4 px-6 focus:ring-2 focus:ring-canina-blue/20 outline-none font-black text-lg" placeholder="مثلاً: لوسی" />
setFormData({ ...formData, breed: e.target.value })} className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl py-4 px-6 focus:ring-2 focus:ring-canina-blue/20 outline-none font-bold" placeholder="آلمانی، پرشین، میکس و..." />
setFormData({ ...formData, imageUrl: e.target.value })} className="flex-1 bg-medical-gray-50 border border-medical-gray-200 rounded-2xl py-3 px-4 focus:ring-2 focus:ring-canina-blue/20 outline-none text-xs font-mono" placeholder="آدرس یا لینک عکس..." />
)} {step === 2 && (
setFormData({ ...formData, age: parseInt(e.target.value) })} className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl py-4 px-6 focus:ring-2 focus:ring-canina-blue/20 outline-none font-black text-lg" placeholder="۳" />
setFormData({ ...formData, weight: parseFloat(e.target.value) })} className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl py-4 pr-6 pl-12 focus:ring-2 focus:ring-canina-blue/20 outline-none font-black text-lg" />
{["کم", "متوسط", "زیاد"].map(level => ( ))}
)} {step === 3 && (
{[ "جراحی مفاصل", "زایمان اخیر", "بارداری", "مشکلات گوارشی", "ریزش موی شدید", "بی‌اشتهایی" ].map(condition => ( ))}
)}
{step > 1 && ( )}
); } // 3. Detailed Dashboard View if (!activePet) return null; return (
{/* Navigation Bar */}
setView("index")}>همدم‌های من پرونده سلامت {activePet?.name}
{/* Profile Card */}
{activePet.type === "سگ" ? : }

{activePet.name}

{activePet.breed}
{[ { icon: , label: "وزن", value: `${toPersian(activePet.weight)} کیلوگرم` }, { icon: , label: "سن", value: `${toPersian(activePet.age)} سال` }, { icon: , label: "فعالیت", value: activePet.activityLevel }, { icon: , label: "وضعیت", value: "نرمال" }, ].map((item, idx) => (
{item.icon} {item.label}
{item.value}
))}
{activePet.medicalConditions.map(c => (
{c}
))}
امتیاز سلامت پایش شده
{toPersian(88)} /۱۰۰

بر اساس پایش هوشمند، وضعیت {activePet.name} در سطح «ایده‌آل» قرار دارد.

{/* Kindness Footprint Widget for Pet */}

ردپای مهربانی

سفیر مهربانی: {activePet.name}

{activePet.name} با خریدهای مکمل خود، تا کنون به تامین هزینه‌های درمانی و تغذیه حیوانات پناهگاهی کمک کرده است.

سطح مشارکت حامی وفادار
{/* Refill & Stock Tracking */}

پایش موجودی مکمل‌ها

بروزرسانی لحظه‌ای بر اساس مصرف
{(activePet?.consumptions || []).length === 0 ? (

هنوز محصولی برای پایش موجودی این پت ثبت نشده است.

با ثبت سفارش جدید، الگوریتم پایش هوشمند کالا به صورت خودکار فعال می‌شود. همچنین می‌توانید محصول مورد مصرف فعلی را انتخاب کنید:

{products.slice(0, 5).map(p => ( ))}
) : ( activePet.consumptions.map((consumption) => { const product = products.find(p => p.id === consumption.productId); if (!product) return null; const percentage = (consumption.remaining / (consumption.packageSize || 1)) * 100; const isLow = percentage < 25; return (

{product.name}

باقیمانده: {toPersian(consumption.remaining)} واحد

{toPersian(Math.round(percentage))}%
{isLow && ( )}
); }) )}
{/* Tab Selection */}
{[ { id: "health", label: "داشبورد سلامت و یادآوری‌ها", icon: }, { id: "orders", label: "سوابق خرید و تاریخچه تخصصی", icon: }, ].map(tab => ( ))}
{activePetTab === "health" ? ( <> {/* Personalized Recommendations */}

توصیه‌های درمانی اختصاصی

کاتالوگ ۲۰۲۴ آلمان

{recommendedProducts.map(({ product: p, reason }) => ( router.push(`/shop/${p.slug || p.id}`)} className="bg-white rounded-[2.5rem] p-6 border border-medical-gray-200 hover:shadow-2xl transition-all cursor-pointer group flex flex-col justify-between relative overflow-hidden" > {reason && (
{reason}
)}

{p.name}

{p.benefits}

))}
{/* Reminders */}

یادآورهای فعال

{(activePet?.reminders || []).length === 0 ? (

هنوز یادآوری ثبت نشده است

) : ( (activePet?.reminders || []).map((reminder) => { const today = new Date().toISOString().split('T')[0]; const isCompleted = reminder.completedDates.includes(today); return (
{reminder.title}

{toPersian(reminder.time)} - {reminder.frequency}

{isCompleted ? "انجام شد" : "در انتظار"}
); }) )}
{/* Health Logs */}

تایم‌لاین سلامت

{(activePet?.logs || []).length === 0 ? (

هنوز گزارشی ثبت نشده است

) : ( (activePet?.logs || []).map((log) => (
{toPersian(new Date(log.date).toLocaleDateString("fa-IR"))}
{log.appetite}
{log.energy}

{log.note || "وضعیتی برای این روز ثبت نشده است."}

)) )}
) : (

تاریخچه خرید {activePet.name}

لیست محصولات خریداری شده ویژه این پرونده سلامت

مجموع هزینه درمانی
{toPersian(petOrders.reduce((a, b) => a + b.total, 0).toLocaleString())} تومان
{petOrders.length === 0 ? (

هنوز سفارشی برای {activePet.name} ثبت نکرده‌اید.

) : (
{petOrders.map(order => order.items.map(item => ( router.push(`/shop/${item.product.slug || item.product.id}`)} > {/* Info on Left (Text side) */}

{item.product.name}

{toPersian(new Date(order.date).toLocaleDateString("fa-IR", { year: 'numeric', month: 'long', day: 'numeric' }))}
تایید شده و تحویل شده
فاکتور: {toPersian(order.id)}
{/* Image on Right (Icon side) */}
)) )}
)}
)} {/* Seal of Authenticity */}
آلمان

ضمانت اصالت و سلامت کانینا آلمان

این گزارش توسط سیستم هوش مصنوعی کانینا و با انطباق کامل بر پروتکل‌های درمانی Canina Pharma GmbH آلمان تولید شده است. تمامی مکمل‌های پیشنهادی دارای استاندارد دارویی (Pharmaceutical Grade) می‌باشند.

{/* Add Reminder Modal */} {isAddingReminder && (
setIsAddingReminder(false)} />

افزودن یادآور جدید

setReminderForm({ ...reminderForm, title: e.target.value })} placeholder="مثلاً: قرص مفاصل، کانهیدروکس" className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl py-4 px-6 focus:ring-2 focus:ring-canina-blue/20 outline-none font-bold" />
setReminderForm({ ...reminderForm, time: e.target.value })} className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl py-4 px-6 focus:ring-2 focus:ring-canina-blue/20 outline-none font-black" />
)}
{/* Add Health Log Modal */} {isAddingHealthLog && (
setIsAddingHealthLog(false)} />

ثبت گزارش روزانه سلامت

{["عالی", "متوسط", "کم"].map(opt => ( ))}
{["زیاد", "نرمال", "بی‌حال"].map(opt => ( ))}