<?php

namespace App\Support;

/**
 * اعتبارسنجی استاندارد شماره کارت و شبا (ایران).
 */
class BankValidation
{
    /** طول شماره کارت بانکی ایران */
    public const CARD_LENGTH = 16;

    /** طول شبا بدون پیش‌وند IR */
    public const SHEBA_LENGTH = 24;

    /**
     * اعتبارسنجی شماره کارت با الگوریتم Luhn
     */
    public static function isValidCardNumber(string $value): bool
    {
        $digits = preg_replace('/\D/', '', $value);
        if (strlen($digits) !== self::CARD_LENGTH || !ctype_digit($digits)) {
            return false;
        }

        $sum = 0;
        $len = strlen($digits);
        for ($i = 0; $i < $len; $i++) {
            $n = (int) $digits[$len - 1 - $i];
            if ($i % 2 === 1) {
                $n *= 2;
                if ($n > 9) {
                    $n -= 9;
                }
            }
            $sum += $n;
        }

        return $sum % 10 === 0;
    }

    /**
     * اعتبارسنجی شبا (IBAN ایران): IR + ۲۴ رقم، استاندارد ISO 7064 Mod 97
     * ورودی می‌تواند با یا بدون پیش‌وند IR باشد (فقط ۲۴ رقم).
     */
    public static function isValidSheba(string $value): bool
    {
        $raw = preg_replace('/\D/', '', $value);
        $sheba = preg_replace('/^IR/i', '', $raw);
        if (strlen($sheba) !== self::SHEBA_LENGTH || !ctype_digit($sheba)) {
            return false;
        }

        // ISO 7064: چهار کاراکتر اول (IR + دو رقم کنترل) به انتها منتقل می‌شوند؛ IR → 18, 27
        $reordered = substr($sheba, 2, 22).'1827'.substr($sheba, 0, 2);

        return (int) bcmod($reordered, '97') === 1;
    }
}
