export function emptyToNull(value?: string | null): string | null { if (value == null) return null; const trimmed = value.trim(); return trimmed.length ? trimmed : null; } export function normalizeEmail(value?: string | null): string | null { const v = emptyToNull(value); return v ? v.toLowerCase() : null; } const FA_DIGITS = '۰۱۲۳۴۵۶۷۸۹'; const AR_DIGITS = '٠١٢٣٤٥٦٧٨٩'; /** ارقام فارسی و عربی را به لاتین برمی‌گرداند تا از شماره حذف نشوند. */ function latinDigits(value: string): string { return value.replace(/[۰-۹٠-٩]/g, (ch) => { const fa = FA_DIGITS.indexOf(ch); return String(fa >= 0 ? fa : AR_DIGITS.indexOf(ch)); }); } /** Keep digits and leading + for Iranian/international numbers. */ export function normalizePhone(value?: string | null): string | null { const v = emptyToNull(value); if (!v) return null; const cleaned = latinDigits(v).replace(/[^\d+]/g, ''); return cleaned.length ? cleaned : null; } /** موبایل ایران به شکل 09xxxxxxxxx. 912… و 98912… و +98912… همان شماره‌اند. */ export function canonicalIranMobile(value?: string | null): string | null { const n = normalizePhone(value); if (!n) return null; let d = n.replace(/\D/g, ''); if (!d) return null; if (d.startsWith('0098') && d.length >= 14) d = d.slice(4); else if (d.startsWith('98') && d.length >= 12) d = d.slice(2); if (d.length === 10 && d.startsWith('9')) d = `0${d}`; return /^09\d{9}$/.test(d) ? d : null; } /** شکل‌هایی که ممکن است همین موبایل با آن‌ها ذخیره شده باشد. */ export function iranMobileLookupKeys(value?: string | null): string[] { const canon = canonicalIranMobile(value); if (!canon) return []; const core = canon.slice(1); return [canon, core, `98${core}`, `+98${core}`, `0098${core}`]; } /** برای تطبیق: اگر موبایل ایران است همه شکل‌ها، وگرنه همان متن نرمال‌شده. */ export function phoneIdentityKeys(value?: string | null): string[] { const keys = iranMobileLookupKeys(value); if (keys.length) return keys; const n = normalizePhone(value); return n ? [n] : []; } /** ذخیره: موبایل ایران همیشه 09… ؛ بقیه شماره‌ها فقط تمیز می‌شوند. */ export function storedPhoneNumber(value?: string | null): string | null { return canonicalIranMobile(value) ?? normalizePhone(value); }