import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsBoolean, IsIn, IsNotEmpty, IsOptional, IsString } from 'class-validator';

export class UpsertSettingDto {
  @ApiProperty({ description: 'Ключ настройки', example: 'PIN_LOCK_TIMEOUT_MINUTES' })
  @IsString({ message: 'Ключ настройки должен быть строкой' })
  @IsNotEmpty({ message: 'Укажите ключ настройки' })
  key!: string;

  @ApiProperty({ description: 'Значение настройки', example: '15' })
  @IsString({ message: 'Значение настройки должно быть строкой' })
  value!: string;

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

  @ApiPropertyOptional({ description: 'Скрывать ли значение в интерфейсе' })
  @IsOptional()
  @IsBoolean({ message: 'Признак секрета должен быть логическим значением' })
  isSecret?: boolean;
}

export class UpsertSocialProviderDto {
  @ApiProperty({ description: 'Название OAuth провайдера', example: 'google' })
  @IsString({ message: 'Название провайдера должно быть строкой' })
  @IsNotEmpty({ message: 'Укажите провайдера' })
  providerName!: string;

  @ApiProperty({ description: 'OAuth Client ID провайдера' })
  @IsString({ message: 'Client ID должен быть строкой' })
  @IsNotEmpty({ message: 'Укажите Client ID' })
  clientId!: string;

  @ApiPropertyOptional({ description: 'OAuth Client Secret провайдера' })
  @IsOptional()
  @IsString({ message: 'Client Secret должен быть строкой' })
  clientSecret?: string;

  @ApiProperty({ description: 'Включен ли провайдер для входа' })
  @IsBoolean({ message: 'Статус провайдера должен быть логическим значением' })
  isEnabled!: boolean;
}

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

  @ApiProperty({ description: 'Email или номер телефона получателя', example: 'user@example.com' })
  @IsString({ message: 'Получатель должен быть строкой' })
  @IsNotEmpty({ message: 'Укажите email или телефон' })
  target!: string;
}

export class ConnectLinkedAccountDto {
  @ApiProperty({ description: 'Название провайдера', example: 'google' })
  @IsString({ message: 'Название провайдера должно быть строкой' })
  providerName!: string;

  @ApiProperty({ description: 'ID пользователя у внешнего провайдера', example: 'google-user-123' })
  @IsString({ message: 'ID провайдера должен быть строкой' })
  providerId!: string;

  @ApiPropertyOptional({ description: 'Почта внешнего аккаунта' })
  @IsOptional()
  @IsString({ message: 'Почта внешнего аккаунта должна быть строкой' })
  email?: string;

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

  @ApiPropertyOptional({ description: 'Аватар внешнего аккаунта' })
  @IsOptional()
  @IsString({ message: 'Аватар внешнего аккаунта должен быть строкой' })
  avatarUrl?: string;
}
