import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsBoolean, IsEmail, IsEnum, IsOptional, IsString, Matches, MinLength } from 'class-validator';

export enum GatewayUserStatus {
  ACTIVE = 'ACTIVE',
  SUSPENDED = 'SUSPENDED',
  DELETED = 'DELETED'
}

export class ListUsersQueryDto {
  @ApiPropertyOptional({ description: 'Поиск по почте, телефону, имени или логину' })
  @IsOptional()
  @IsString({ message: 'Поисковая строка должна быть текстом' })
  search?: string;
}

export class UpdateUserDto {
  @ApiPropertyOptional({ description: 'Отображаемое имя' })
  @IsOptional()
  @IsString({ message: 'Имя должно быть строкой' })
  displayName?: string;

  @ApiPropertyOptional({ description: 'Основная почта' })
  @IsOptional()
  @IsEmail({}, { message: 'Укажите корректную почту' })
  email?: string;

  @ApiPropertyOptional({ description: 'Основной телефон' })
  @IsOptional()
  @Matches(/^\+?[1-9]\d{7,14}$/, { message: 'Укажите корректный телефон' })
  phone?: string;

  @ApiPropertyOptional({ description: 'Резервная почта' })
  @IsOptional()
  @IsEmail({}, { message: 'Укажите корректную резервную почту' })
  backupEmail?: string;

  @ApiPropertyOptional({ description: 'Резервный телефон' })
  @IsOptional()
  @Matches(/^\+?[1-9]\d{7,14}$/, { message: 'Укажите корректный резервный телефон' })
  backupPhone?: string;

  @ApiPropertyOptional({ description: 'Статус пользователя', enum: GatewayUserStatus })
  @IsOptional()
  @IsEnum(GatewayUserStatus, { message: 'Укажите корректный статус пользователя' })
  status?: GatewayUserStatus;
}

export class ResetPasswordDto {
  @ApiProperty({ description: 'Новый пароль пользователя', minLength: 8 })
  @IsString({ message: 'Пароль должен быть строкой' })
  @MinLength(8, { message: 'Пароль должен содержать минимум 8 символов' })
  newPassword!: string;
}

export class SetSuperAdminDto {
  @ApiProperty({ description: 'Выдать или снять права супер-администратора' })
  @IsBoolean({ message: 'isSuperAdmin должно быть boolean' })
  isSuperAdmin!: boolean;
}

export class SetUserVerificationDto {
  @ApiProperty({ description: 'Верифицировать или снять верификацию' })
  @IsBoolean({ message: 'isVerified должно быть boolean' })
  isVerified!: boolean;

  @ApiPropertyOptional({ description: 'Slug значка из списка (badge-check, star, moon и т.д.)' })
  @IsOptional()
  @IsString({ message: 'Значок должен быть строкой' })
  verificationIcon?: string;
}
