import { IsEmail, IsString, MinLength, MaxLength, IsOptional, Matches, IsIn, IsArray, ArrayMaxSize, Max } from 'class-validator';

export class RegisterDto {
  @IsEmail()
  email!: string;

  @IsString()
  @MinLength(12, { message: 'Password must be at least 12 characters long' })
  @MaxLength(72)
  @Matches(/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[^A-Za-z\d]).*$/, {
    message: 'Password must contain at least one uppercase, one lowercase, one number, and one special character',
  })
  password!: string;

  @IsString()
  @MinLength(2)
  @MaxLength(80)
  display_name!: string;

  @IsOptional()
  @IsString()
  @MaxLength(80)
  workspace_name?: string;
}

export class LoginDto {
  @IsEmail()
  email!: string;

  @IsString()
  @MinLength(1)
  password!: string;
}

export class RefreshDto {
  @IsString()
  refresh_token!: string;
}

export class ForgotPasswordDto {
  @IsEmail()
  email!: string;
}

export class ResetPasswordDto {
  @IsString()
  token!: string;

  @IsString()
  @MinLength(12, { message: 'Password must be at least 12 characters long' })
  @MaxLength(72)
  password!: string;
}

export class Verify2faDto {
  @IsString()
  @Matches(/^\d{6}$/, { message: 'Code must be 6 digits' })
  code!: string;
}

export class Enable2faDto {
  @IsString()
  @MinLength(1)
  password!: string;
}

export class Verify2faEnableDto {
  @IsString()
  @Matches(/^\d{6}$/, { message: 'Code must be 6 digits' })
  code!: string;
}

export class Disable2faDto {
  @IsString()
  @MinLength(1)
  password!: string;
}

export class Login2faDto {
  @IsString()
  @MinLength(1)
  email!: string;

  @IsString()
  @MinLength(1)
  password!: string;

  @IsString()
  @Matches(/^\d{6}$|^\d{8}$/, { message: 'Code must be 6 digits (TOTP) or 8 digits (backup code)' })
  code!: string;
}