export function isSuitableForDog(suitableFor?: string): boolean { if (!suitableFor) return true; const s = suitableFor.trim().toLowerCase(); return s === "سگ" || s.includes("سگ") || s.includes("هر دو") || s.includes("مشترک") || s.includes("both") || s.includes("dog"); } export function isSuitableForCat(suitableFor?: string): boolean { if (!suitableFor) return true; const s = suitableFor.trim().toLowerCase(); return s === "گربه" || s.includes("گربه") || s.includes("هر دو") || s.includes("مشترک") || s.includes("both") || s.includes("cat"); } export function isSuitableForBoth(suitableFor?: string): boolean { if (!suitableFor) return true; const s = suitableFor.trim().toLowerCase(); if (s.includes("هر دو") || s.includes("مشترک") || s.includes("both")) return true; return isSuitableForDog(s) && isSuitableForCat(s); } export function isSpeciesCompatible(suitableFor: string | undefined, petType: string | undefined): boolean { if (!petType) return true; const isDog = petType.includes("سگ") || petType.toLowerCase().includes("dog"); const isCat = petType.includes("گربه") || petType.toLowerCase().includes("cat"); if (isSuitableForBoth(suitableFor)) return true; if (isDog) return isSuitableForDog(suitableFor); if (isCat) return isSuitableForCat(suitableFor); return true; } /** * Partial / fuzzy matching between pet medical conditions and product symptoms */ export function matchesMedicalSymptom( petConditions: string[] | undefined, productSymptoms: string[] | undefined, productBenefits?: string ): string | null { if (!petConditions || petConditions.length === 0) return null; // Filter out negative conditions like "هیچ‌کدام" const validConditions = petConditions.filter( (c) => c && !c.includes("هیچ‌کدام") && !c.includes("سلامت کامل") ); if (validConditions.length === 0) return null; const symptoms = (productSymptoms || []).filter(Boolean); const benefitsText = (productBenefits || "").toLowerCase(); for (const condition of validConditions) { const condNorm = condition.trim().toLowerCase(); // Check direct symptom list for (const symptom of symptoms) { const sympNorm = symptom.trim().toLowerCase(); if ( condNorm.includes(sympNorm) || sympNorm.includes(condNorm) || // Check core keywords (condNorm.includes("مفصل") && sympNorm.includes("مفصل")) || (condNorm.includes("گوارش") && (sympNorm.includes("گوارش") || sympNorm.includes("اسهال") || sympNorm.includes("غذا"))) || (condNorm.includes("مو") && (sympNorm.includes("مو") || sympNorm.includes("پوست") || sympNorm.includes("خارش"))) || (condNorm.includes("اشتها") && sympNorm.includes("اشتها")) || (condNorm.includes("باردار") && sympNorm.includes("باردار")) || (condNorm.includes("زایمان") && (sympNorm.includes("شیر") || sympNorm.includes("توله") || sympNorm.includes("زایمان"))) ) { return condition; } } // Also check benefits text if available if (benefitsText) { if ( (condNorm.includes("مفصل") && benefitsText.includes("مفصل")) || (condNorm.includes("گوارش") && benefitsText.includes("گوارش")) || (condNorm.includes("مو") && (benefitsText.includes("ریزش") || benefitsText.includes("پوست"))) || (condNorm.includes("اشتها") && benefitsText.includes("اشتها")) ) { return condition; } } } return null; }