"use client"; import React, { useState, useEffect } from "react"; import Link from "next/link"; import { motion, AnimatePresence } from "motion/react"; import { useSettingsStore } from "../lib/store/settingsStore"; import { Dog, Cat, ChevronLeft, ChevronRight, ShieldCheck, Activity, Pill, Sparkle, Check, Download } from "lucide-react"; import { cn } from "../lib/utils"; import { PRODUCTS } from "../lib/data/products"; import { productService } from "../lib/services/productService"; import { useRouter } from "next/navigation"; import { useUserStore } from "../lib/store/userStore"; import { useUIStore } from "../lib/store/uiStore"; import { usePetStore } from "../lib/store/usePetStore"; import api from "../lib/services/api"; interface SmartAdvisorProps { onComplete?: (data: Record) => void; } const CURRENT_SYMPTOMS = [ { id: "joint_pain", label: "درد مفاصل و لنگیدن", condition: "درد مفاصل" }, { id: "hair_loss", label: "ریزش مو، خارش و خشکی پوست", condition: "ریزش مو" }, { id: "diarrhea", label: "اسهال، یبوست و مشکلات گوارشی", condition: "اسهال" }, { id: "appetite", label: "بی‌اشتهایی و کاهش وزن", condition: "بی‌اشتهایی" }, { id: "dental", label: "جرم دندان و بوی بد دهان", condition: "جرم دندان" }, { id: "eye", label: "ترشحات یا مشکلات چشم", condition: "چشم" }, { id: "puppy_growth", label: "رشد سریع و تعادل استخوانی", condition: "رشد سریع توله‌سگ" }, { id: "tendon", label: "سفتی عضلات و ضعف تاندون", condition: "تاندون" }, ]; const MEDICAL_HISTORIES = [ { id: "joint_surgery", label: "سابقه جراحی مفاصل/استخوان", condition: "جراحی مفاصل" }, { id: "recent_birth", label: "زایمان اخیر / شیردهی فعال", condition: "زایمان اخیر" }, { id: "pregnancy", label: "دوران بارداری", condition: "بارداری" }, { id: "weakness", label: "ضعف بعد از بیماری / نقاهت", condition: "ضعف بعد از بیماری" }, { id: "heart", label: "نارسایی یا حساسیت قلبی", condition: "نارسایی قلبی" }, { id: "parasite", label: "سابقه آلودگی انگلی", condition: "آلودگی انگلی" }, ]; export default function SmartAdvisor({ onComplete, rules = [] }: SmartAdvisorProps & { rules?: unknown[] }) { const router = useRouter(); const { isLoggedIn } = useUserStore(); const setLoginModalOpen = useUIStore(state => state.setLoginModalOpen); const { addPet, setActivePet } = usePetStore(); const getText = useSettingsStore(state => state.getText); const [advisorRules, setAdvisorRules] = useState(rules); useEffect(() => { if (rules && rules.length > 0) { Promise.resolve().then(() => setAdvisorRules(rules)); } else { api.get('/smart-advisor/rules') .then(res => { if (Array.isArray(res.data)) { setAdvisorRules(res.data); } }) .catch(err => console.error("[SmartAdvisor] Failed to fetch rules:", err)); } }, [rules]); const [step, setStep] = useState(1); // Step 1 Data const [name, setName] = useState(""); const [type, setType] = useState<"سگ" | "گربه">("سگ"); const [breed, setBreed] = useState(""); const [showError, setShowError] = useState(false); const [shake, setShake] = useState(false); // Step 2 Data const [age, setAge] = useState(3); const [weight, setWeight] = useState(10); const [activityLevel, setActivityLevel] = useState<"کم" | "متوسط" | "زیاد">("متوسط"); // Step 3 Data (Symptoms) & Step 4 Data (History) const [currentSymptoms, setCurrentSymptoms] = useState([]); const [medicalConditions, setMedicalConditions] = useState([]); const handleNext = () => { if (step === 1) { if (!name.trim() || !breed.trim()) { setShowError(true); setShake(true); setTimeout(() => setShake(false), 500); return; } } setStep(s => s + 1); }; const handleBack = () => setStep(s => s - 1); const calculateRecommendation = async () => { const combinedConditions = Array.from(new Set([...currentSymptoms, ...medicalConditions])); let matchedProd: Record | null = null; // First, check fetched advisor rules if (advisorRules && advisorRules.length > 0) { const foundRule = advisorRules.find((r) => { const ruleObj = r as Record; const targetPetType = ruleObj.targetPetType as string | undefined; const condition = ruleObj.condition as string | undefined; const petMatch = !targetPetType || targetPetType === "هر دو" || targetPetType === type; const conditionMatch = combinedConditions.some(c => condition?.includes(c) || c.includes(condition || '')); return petMatch && conditionMatch; }) as Record | undefined; if (foundRule && foundRule.product) { matchedProd = foundRule.product as Record; } } // Second, query dynamic products API if (!matchedProd) { try { const liveRes = await productService.getProducts({ petType: type, limit: 50 }); if (liveRes.data && liveRes.data.length > 0) { const found = liveRes.data.find(p => { const matchPet = p.suitableFor === "هر دو" || p.suitableFor === type; const matchSymptom = p.symptoms?.some((s: string) => combinedConditions.some(c => s.includes(c) || c.includes(s))); return matchPet && matchSymptom; }); matchedProd = (found || liveRes.data[0]) as unknown as Record; } } catch (e) { console.error("[SmartAdvisor] Dynamic product fetch failed, using fallback", e); } } if (!matchedProd) { const fallback = PRODUCTS.find(p => p.suitableFor === "هر دو" || p.suitableFor === type) || PRODUCTS[0]; matchedProd = fallback as unknown as Record; } }; const handleSubmit = () => { const combinedConditions = Array.from(new Set([...currentSymptoms, ...medicalConditions])); const data = { name, type, breed, age, weight, activityLevel, medicalConditions: combinedConditions }; calculateRecommendation(); if (onComplete) { onComplete(data); } else { if (!isLoggedIn) { setLoginModalOpen(true, data); } else { const newPet = { ...data, id: Date.now().toString(), reminders: [], logs: [], consumptions: [] }; addPet(newPet); setActivePet(newPet.id); router.push('/profile'); } } }; return (
{/* Header Title */}
{getText('advisor_badge', "سیستم پایش و تجویز هوشمند")}

{getText('advisor_title', "دستیار سلامت و الگوریتم پایش کنینا")}

{getText('advisor_subtitle', "با ثبت اطلاعات همدم خود در ۴ قدم ساده، از الگوریتم علمی کنینا برای تجویز دقیق مکمل و پایش سلامت بهره‌مند شوید.")}

مشاهده کاتالوگ و جدول دوز آلمان
{/* Value Proposition Cards (Explaining Why & How) */}

چرا ثبت شناسنامه؟

مکمل‌های دارویی کنینا غلیظ و تخصصی هستند؛ الگوریتم هوشمند ما بر اساس سن، وزن و جثه پت شما، دوز دقیق مصرفی روزانه را محاسبه می‌کند.

تضمین ایمنی و عدم اوردوز

تطبیق علائم بالینی

با انتخاب علائمی مثل لنگیدن یا ریزش مو، دقیق‌ترین راهکار مکمل آلمانی به همراه دلایل علمی به شما پیشنهاد می‌شود.

پیشنهاد هدفمند و تخصصی

پایش موجودی و یادآور

زمان‌های مصرف مکمل‌ها تنظیم شده و سیستم قبل از اتمام دوره درمانی، هشدار شارژ مجدد ارسال خواهد کرد.

تکمیل منظم دوره درمان
{/* Progress Indicator */}
{step === 1 && (

{getText('advisor_step1_title', "گام اول: هویت بصری")}

{getText('advisor_step1_desc', "همدم شما رو با چه اسمی صدا می‌زنید؟")}

{ setName(e.target.value); if (e.target.value.trim() && breed.trim()) setShowError(false); }} placeholder={getText('advisor_pet_name_placeholder', "لوسی، تدی...")} className={cn( "w-full bg-white border rounded-2xl py-4 px-6 focus:ring-2 outline-none font-black text-lg font-vazir placeholder-medical-gray-500 text-medical-gray-900 transition-all", showError && !name.trim() ? "border-red-500 focus:ring-red-500/30" : "border-medical-gray-300 focus:ring-canina-blue/30 focus-visible:ring-4 focus-visible:ring-canina-blue/40" )} />
{ setBreed(e.target.value); if (name.trim() && e.target.value.trim()) setShowError(false); }} placeholder={getText('advisor_pet_breed_placeholder', "ژرمن، پرشین...")} className={cn( "w-full bg-white border rounded-2xl py-4 px-6 focus:ring-2 outline-none font-bold font-vazir placeholder-medical-gray-500 text-medical-gray-900 transition-all", showError && !breed.trim() ? "border-red-500 focus:ring-red-500/30" : "border-medical-gray-300 focus:ring-canina-blue/30 focus-visible:ring-4 focus-visible:ring-canina-blue/40" )} />
{getText('advisor_submit_btn', "ثبت هویت و ادامه")} {showError && (!name.trim() || !breed.trim()) && (

{getText('advisor_validation_warning', "⚠️ لطفاً ابتدا نام و نژاد پت را در بالا وارد کنید.")}

)}
)} {step === 2 && (

{getText('advisor_step2_title', "گام دوم: پایش فیزیکی")}

{getText('advisor_step2_desc', "اطلاعات فیزیکی دقیق به دوزبندی صحیح مکمل‌ها کمک می‌کند")}

setAge(Math.max(0, parseInt(e.target.value) || 0))} className="w-12 text-center text-xl font-black text-canina-blue font-vazir outline-none bg-transparent" /> سال
setWeight(Math.max(1, parseInt(e.target.value) || 1))} className="w-16 text-center text-xl font-black text-canina-blue font-vazir outline-none bg-transparent" /> kg
{["کم", "متوسط", "زیاد"].map(level => ( ))}
)} {step === 3 && (

{getText('advisor_step3_symptoms_title', "گام سوم: علائم بالینی فعلی")}

{getText('advisor_step3_symptoms_desc', "آیا همدم شما در حال حاضر هیچ‌کدام از علائم زیر را تجربه می‌کند؟")}

{CURRENT_SYMPTOMS.map((opt) => ( ))}
)} {step === 4 && (

{getText('advisor_step4_history_title', "گام چهارم: سوابق پزشکی و جراحی")}

{getText('advisor_step4_history_desc', "در صورت وجود سابقه جراحی، بارداری یا نارسایی، آن را مشخص کنید")}

{MEDICAL_HISTORIES.map((opt) => ( ))}
)}
); }