import {
  IsBoolean,
  IsEmail,
  IsEnum,
  IsOptional,
  IsString,
  Matches,
  MaxLength,
  MinLength,
} from "class-validator";
import { Transform } from "class-transformer";
import { UserRole } from "@prisma/client";

export class CreateUserDto {
  @IsString()
  @MinLength(2)
  @MaxLength(100)
  @Transform(({ value }: { value: string }) => value?.trim())
  name!: string;

  @IsEmail()
  @MaxLength(255)
  @Transform(({ value }: { value: string }) => value?.toLowerCase().trim())
  email!: string;

  /**
   * Senha deve ter no mínimo 8 caracteres, pelo menos 1 letra maiúscula,
   * 1 letra minúscula e 1 número.
   */
  @IsString()
  @MinLength(8, { message: "A senha deve ter no mínimo 8 caracteres." })
  @MaxLength(128, { message: "A senha não pode ter mais de 128 caracteres." })
  @Matches(/(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/, {
    message:
      "A senha deve conter pelo menos uma letra maiúscula, uma minúscula e um número.",
  })
  password!: string;

  @IsOptional()
  @IsEnum(UserRole)
  role?: UserRole = UserRole.VIEWER;

  @IsOptional()
  @IsBoolean()
  active?: boolean = true;
}
