"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 } 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 { toast } from "sonner"; import { toPersian, cn } from "../lib/utils"; 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() .then(setProducts) .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]); if (isLoading && view === "detail" && activePet) { return (
); } 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 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 recommendedProducts = useMemo(() => { if (!activePet || products.length === 0) return []; let picks: { product: Product, reason?: string }[] = []; // Priority: Medical Conditions if (activePet.medicalConditions.includes("جراحی مفاصل")) { const gag = products.find(p => p.id === "canhydrox-gag"); if (gag) picks.push({ product: gag, reason: "پیشنهاد ویژه بر اساس سوابق جراحی مفاصل" }); } if (activePet.medicalConditions.includes("زایمان اخیر") || activePet.medicalConditions.includes("بارداری")) { const booster = products.find(p => p.id === "immun-booster"); if (booster) picks.push({ product: booster, reason: "حمایت حیاتی دوران بارداری و زایمان" }); } if (activePet.medicalConditions.includes("مشکلات گوارشی")) { const moor = products.find(p => p.id === "moor-tranke"); if (moor) picks.push({ product: moor, reason: "تنظیم تخصصی سیستم گوارش" }); } if (activePet.medicalConditions.includes("ریزش موی شدید")) { const lachs = products.find(p => p.id === "lachs-ol"); if (lachs) picks.push({ product: lachs, reason: "تقویت تارهای مو و کنترل ریزش" }); } if (activePet.medicalConditions.includes("بی‌اشتهایی")) { const energy = products.find(p => p.id === "energy-gel"); if (energy) picks.push({ product: energy, reason: "تامین فوری انرژی و تحریک اشتها" }); } // Biological factors if (activePet.age > 7) { const heart = products.find(p => p.id === "herz-vital"); 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 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"); } } }; // 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") { 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="آلمانی، پرشین، میکس و..." />
)} {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 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 ? (

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

با ثبت اولین سفارش، پایش هوشمند فعال می‌شود.

) : ( 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 }) => ( onProductClick(p)} 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 => ( onProductClick(item.product)} > {/* 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 => ( ))}