import {
  registerDecorator,
  ValidationOptions,
  ValidatorConstraint,
  ValidatorConstraintInterface,
} from 'class-validator';

/** Same rules as FE trip-source / query guest mobile — optional, min 8 digits when present. */
export function isValidOptionalContactPhone(value: unknown): boolean {
  if (value === null || value === undefined) return true;
  if (typeof value !== 'string') return false;
  const trimmed = value.trim();
  if (trimmed === '') return true;
  if (!/^[+\d][\d\s\-()]*$/.test(trimmed)) return false;
  return (trimmed.match(/\d/g) || []).length >= 8;
}

@ValidatorConstraint({ name: 'IsOptionalContactPhone', async: false })
export class IsOptionalContactPhoneConstraint implements ValidatorConstraintInterface {
  validate(value: unknown): boolean {
    return isValidOptionalContactPhone(value);
  }

  defaultMessage(): string {
    return 'Phone must contain at least 8 digits and only use digits, spaces, +, -, ()';
  }
}

export function IsOptionalContactPhone(validationOptions?: ValidationOptions) {
  return (object: object, propertyName: string) => {
    registerDecorator({
      target: object.constructor,
      propertyName,
      options: validationOptions,
      constraints: [],
      validator: IsOptionalContactPhoneConstraint,
    });
  };
}
