<?php

namespace App\Shared\Util;

/**
 * نرمال‌سازی متن فارسی برای مقایسهٔ نام‌ها.
 *
 * تفاوت‌های رایج را یکدست می‌کند: ي/ی عربی-فارسی، ك/ک، ارقام عربی/فارسی،
 * نیم‌فاصله و فاصله‌های تکراری، فاصلهٔ ابتدا/انتها و Unicode normalization —
 * تا مقایسهٔ نام هرگز با compare خام رشته انجام نشود.
 */
final class PersianText
{
    public static function normalize(string $text): string
    {
        if (class_exists(\Normalizer::class)) {
            $text = \Normalizer::normalize($text, \Normalizer::FORM_KC) ?: $text;
        }

        $text = strtr($text, [
            "\u{064A}" => 'ی', // ي عربی
            "\u{0649}" => 'ی', // ى الف مقصوره
            "\u{0643}" => 'ک', // ك عربی
            "\u{200C}" => ' ', // نیم‌فاصله → فاصله
            "\u{200B}" => '',  // zero-width space
            "\u{FEFF}" => '',  // BOM
            "\u{0640}" => '',  // کشیده ـ
        ]);

        // ارقام فارسی/عربی → لاتین
        $text = strtr($text, array_combine(
            ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹','٠','١','٢','٣','٤','٥','٦','٧','٨','٩'],
            ['0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9'],
        ));

        return trim(preg_replace('/\s+/u', ' ', $text) ?? $text);
    }

    /**
     * فقط ارقام فارسی/عربی را به لاتین ترجمه می‌کند و بقیهٔ کاراکترها را دست نمی‌زند.
     *
     * برخلاف normalize() فاصله‌ها را جمع نمی‌کند و trim نمی‌کند — برای فیلدهای عددی
     * لازم است، چون شبا حرف دارد و تلفن ثابت خط تیره.
     */
    public static function digits(string $text): string
    {
        return strtr($text, array_combine(
            ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹','٠','١','٢','٣','٤','٥','٦','٧','٨','٩'],
            ['0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9'],
        ));
    }

    /** مقایسهٔ دو نام فارسی پس از نرمال‌سازی. */
    public static function sameName(string $a, string $b): bool
    {
        return self::normalize($a) === self::normalize($b);
    }

    /** حذف عنوان «دکتر» از ابتدای نام (برای مقایسهٔ نام پروفایل با نام ثبت احوال). */
    public static function stripDoctorTitle(string $name): string
    {
        $normalized = self::normalize($name);
        // پیشوندهای متوالی «دکتر دکتر …» را هم کامل حذف می‌کند.
        return trim(preg_replace('/^(?:دکتر\s+)+/u', '', $normalized) ?? $normalized);
    }

    /**
     * نامِ نمایشیِ پزشک با عنوان «دکتر» — تنها نقطهٔ افزودن عنوان در بک‌اند تا همهٔ
     * مصرف‌کننده‌ها (سایت عمومی، پنل، اپ) یکسان و بدون «دکتر دکتر …» ببینند.
     * name در دیتابیس خام می‌ماند؛ این فقط برای serialization است.
     */
    public static function withDoctorTitle(?string $name): string
    {
        $clean = self::stripDoctorTitle((string) ($name ?? ''));

        return $clean === '' ? '' : 'دکتر ' . $clean;
    }
}
