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

/**
 * Vietnamese district name pattern — accepts:
 * - "Quận 1", "Quận Bình Thạnh", "Huyện Củ Chi", "Thành phố Thủ Đức"
 * - Plain names like "Bình Thạnh", "Củ Chi" (without prefix)
 * Minimum 2 characters, maximum 100 characters, Vietnamese Unicode.
 */
const VN_DISTRICT_REGEX = /^[\p{L}\p{N}\s]{2,100}$/u;

@ValidatorConstraint({ name: 'isVietnamDistrict', async: false })
export class IsVietnamDistrictConstraint implements ValidatorConstraintInterface {
  validate(value: unknown): boolean {
    return typeof value === 'string' && VN_DISTRICT_REGEX.test(value.trim());
  }

  defaultMessage(args: ValidationArguments): string {
    return `${args.property} phải là tên quận/huyện hợp lệ (VD: Quận 1, Huyện Củ Chi)`;
  }
}

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