<?php

namespace App\Shared\Service;

/**
 * اعتبارسنجیِ مشترکِ سمت سرور برای ورودی‌های رایج (موبایل ایران، کد ملی).
 * معادلِ منطقِ سمت فرانت تا رفتار یکدست بماند.
 */
final class InputValidator
{
    public static function isValidIranMobile(string $mobile): bool
    {
        return (bool) preg_match('/^09\d{9}$/', self::toEnglishDigits($mobile));
    }

    /** کد ملی: فقط باید دقیقاً ۱۰ رقم باشد (بدون بررسی رقم کنترلی). */
    public static function isValidIranNationalCode(string $code): bool
    {
        return (bool) preg_match('/^\d{10}$/', self::toEnglishDigits($code));
    }

    /**
     * موبایل را برای نمایش ماسک می‌کند: 09120675433 → 0912****33 (۴ رقم اول + ۲ رقم آخر).
     * نتیجه با Unicode LTR-isolate (U+2066…U+2069) محصور می‌شود تا داخلِ متنِ فارسیِ RTL
     * جهتِ ارقام/ستاره به‌هم نریزد.
     */
    public static function maskMobile(string $mobile): string
    {
        $mobile = self::toEnglishDigits($mobile);
        if (strlen($mobile) < 6) {
            return $mobile;
        }
        $masked = substr($mobile, 0, 4) . '****' . substr($mobile, -2);
        return "\u{2066}{$masked}\u{2069}";
    }

    public static function toEnglishDigits(string $s): string
    {
        return strtr($s, [
            '۰' => '0', '۱' => '1', '۲' => '2', '۳' => '3', '۴' => '4',
            '۵' => '5', '۶' => '6', '۷' => '7', '۸' => '8', '۹' => '9',
            '٠' => '0', '١' => '1', '٢' => '2', '٣' => '3', '٤' => '4',
            '٥' => '5', '٦' => '6', '٧' => '7', '٨' => '8', '٩' => '9',
        ]);
    }
}
