import {
  isObject,
  registerDecorator,
  ValidationArguments,
  ValidationOptions,
} from 'class-validator';

export function IsObjectWithValues(
  valueValidators: ((value: unknown) => boolean)[],
  validationOptions?: ValidationOptions,
) {
  return (object: unknown, propertyName: string) => {
    registerDecorator({
      name: 'IsObjectWithValues',
      target: (object as any).constructor,
      propertyName,
      options: validationOptions,

      validator: {
        validate(data: unknown) {
          if (!isObject(data)) return false;

          for (const value of Object.values(data)) {
            const isInvalidValue = valueValidators.some(
              (validator) => !validator(value),
            );
            if (isInvalidValue) {
              return false;
            }
          }

          return true;
        },
        defaultMessage(validationArguments?: ValidationArguments): string {
          return `${validationArguments.property} should be a valid object with proper values`;
        },
      },
    });
  };
}