import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';

export function IsIranianNationalCode(validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      name: 'isIranianNationalCode',
      target: object.constructor,
      propertyName: propertyName,
      options: validationOptions,
      validator: {
        validate(value: any) {
          if (typeof value !== 'string' || !/^\d{10}$/.test(value)) return false;
          const check = +value[9];
          const sum = value
            .split('')
            .slice(0, 9)
            .reduce((total, num, index) => total + +num * (10 - index), 0);
          const remainder = sum % 11;
          return (remainder < 2 && check === remainder) || (remainder >= 2 && check === 11 - remainder);
        },
        defaultMessage(): string {
          return 'کد ملی نامعتبر است';
        },
      },
    });
  };
}
