import { registerDecorator, ValidationOptions } from 'class-validator';

export function IsIranianCardNumber(validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      name: 'isIranianCardNumber',
      target: object.constructor,
      propertyName,
      options: validationOptions,
      validator: {
        validate(cardNumber: any) {
          // اطمینان از اینکه ورودی از نوع رشته است
          if (typeof cardNumber !== 'string') return false;
          
          // بررسی طول کارت
          if (!/^\d{16}$/.test(cardNumber)) return false;

          const digits = cardNumber.split('').map(Number); // تبدیل به آرایه از اعداد
          const sum = digits
            .slice(0, 15)
            .map((d, i) => {
              const p = d * ((i % 2 === 0) ? 2 : 1);
              return p > 9 ? p - 9 : p;
            })
            .reduce((a, b) => a + b, 0);
          
          const checkDigit = (10 - (sum % 10)) % 10;
          return checkDigit === digits[15];
        },
        defaultMessage: () => 'شماره کارت نامعتبر است.',
      },
    });
  };
}
