86 lines
3.6 KiB
TypeScript
86 lines
3.6 KiB
TypeScript
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;
|
|
}
|