import { applyDecorators } from '@nestjs/common';
import { IsNotEmpty, IsString, Matches, MaxLength } from 'class-validator';

export function IsUsername() {
  const isString = IsString({
    message: 'Nome de usuário deve ser uma string',
  });

  const isNotEmpty = IsNotEmpty({
    message: 'Nome de usuário não pode estar vazio',
  });

  const maxLength = MaxLength(32, {
    message: 'Nome de usuário deve ser menor do que $constraint1 caracteres',
  });

  const matchesInitialInvalidCharacters = Matches(/^(?![0-9_.])/, {
    message: 'Nome de usuário deve começar com uma letra',
  });

  const matchesInvalidDoubleCharacters = Matches(/^(?!.*[._]{2}).*$/, {
    message:
      'Nome de usuário não deve possuir múltiplos pontos ou underlines juntos',
  });

  const matchesValidCharacters = Matches(/^[a-zA-Z0-9._]+$/, {
    message:
      'Nome de usuário deve conter apenas letras, números, underlines e pontos',
  });

  return applyDecorators(
    isString,
    isNotEmpty,
    maxLength,
    matchesInitialInvalidCharacters,
    matchesInvalidDoubleCharacters,
    matchesValidCharacters,
  );
}
