import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsEmail, IsInt, IsNotEmpty, IsOptional, IsString, IsUrl, Matches, Max, Min, MinLength } from 'class-validator';

export class UpdateAvatarDto {
  @ApiPropertyOptional({ description: 'Публичная ссылка на аватар (legacy)', example: 'https://cdn.lendry.ru/avatars/user.png' })
  @IsOptional()
  @IsUrl({}, { message: 'Укажите корректную ссылку на аватар' })
  avatarUrl?: string;

  @ApiPropertyOptional({ description: 'Ключ объекта в MinIO', example: 'avatars/uuid/photo.jpg' })
  @IsOptional()
  @IsString({ message: 'Ключ хранилища должен быть строкой' })
  avatarStorageKey?: string;
}

export class UpdateProfileDto {
  @ApiPropertyOptional({ description: 'Имя пользователя', example: 'Дмитрий' })
  @IsOptional()
  @IsString({ message: 'Имя должно быть строкой' })
  firstName?: string;

  @ApiPropertyOptional({ description: 'Фамилия пользователя', example: 'Мамедов' })
  @IsOptional()
  @IsString({ message: 'Фамилия должна быть строкой' })
  lastName?: string;

  @ApiPropertyOptional({ description: 'Краткое описание профиля', example: 'Разработчик и владелец аккаунта' })
  @IsOptional()
  @IsString({ message: 'Описание должно быть строкой' })
  bio?: string;

  @ApiPropertyOptional({ description: 'Возраст пользователя', minimum: 0, maximum: 130, example: 24 })
  @IsOptional()
  @IsInt({ message: 'Возраст должен быть целым числом' })
  @Min(0, { message: 'Возраст не может быть отрицательным' })
  @Max(130, { message: 'Возраст указан некорректно' })
  age?: number;

  @ApiPropertyOptional({ description: 'Пол пользователя', example: 'male' })
  @IsOptional()
  @IsString({ message: 'Пол должен быть строкой' })
  gender?: string;

  @ApiPropertyOptional({ description: 'Дата рождения в формате YYYY-MM-DD', example: '1990-05-15' })
  @IsOptional()
  @Matches(/^\d{4}-\d{2}-\d{2}$/, { message: 'Укажите дату рождения в формате ГГГГ-ММ-ДД' })
  birthDate?: string;
}

export class UpdateContactsDto {
  @ApiPropertyOptional({ description: 'Основная почта пользователя', example: 'user@example.com' })
  @IsOptional()
  @IsEmail({}, { message: 'Укажите корректную почту' })
  email?: string;

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

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

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

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

export class SendPasswordVerificationOtpDto {
  @ApiProperty({ description: 'Канал OTP', enum: ['sms', 'email'] })
  @IsString({ message: 'Канал должен быть строкой' })
  channel!: 'sms' | 'email';
}

export class PasswordVerificationDto {
  @ApiPropertyOptional({ description: 'Текущий пароль' })
  @IsOptional()
  @IsString({ message: 'Текущий пароль должен быть строкой' })
  currentPassword?: string;

  @ApiPropertyOptional({ description: 'OTP-код из SMS или почты' })
  @IsOptional()
  @IsString({ message: 'OTP-код должен быть строкой' })
  otpCode?: string;

  @ApiPropertyOptional({ description: 'Канал OTP', enum: ['sms', 'email'] })
  @IsOptional()
  @IsString({ message: 'Канал OTP должен быть строкой' })
  otpChannel?: 'sms' | 'email';

  @ApiPropertyOptional({ description: 'Код из приложения-аутентификатора' })
  @IsOptional()
  @IsString({ message: 'Код аутентификатора должен быть строкой' })
  totpCode?: string;
}

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

export class UserIdParamDto {
  @ApiProperty({ description: 'ID пользователя' })
  @IsString({ message: 'ID пользователя должен быть строкой' })
  @IsNotEmpty({ message: 'Передайте ID пользователя' })
  userId!: string;
}
