import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsDateString, IsEnum, IsJSON, IsOptional, IsString } from 'class-validator';

export enum DocumentTypeDto {
  PASSPORT_RF = 'PASSPORT_RF',
  FOREIGN_PASSPORT = 'FOREIGN_PASSPORT',
  BIRTH_CERTIFICATE = 'BIRTH_CERTIFICATE',
  DRIVER_LICENSE = 'DRIVER_LICENSE',
  VEHICLE_REGISTRATION = 'VEHICLE_REGISTRATION',
  OMS = 'OMS',
  DMS = 'DMS',
  INN = 'INN',
  SNILS = 'SNILS'
}

export class CreateDocumentDto {
  @ApiProperty({ description: 'Тип документа', enum: DocumentTypeDto, example: DocumentTypeDto.PASSPORT_RF })
  @IsEnum(DocumentTypeDto, { message: 'Некорректный тип документа' })
  type!: DocumentTypeDto;

  @ApiPropertyOptional({ description: 'Номер документа. Перед сохранением будет зашифрован.', example: '4512 123456' })
  @IsOptional()
  @IsString({ message: 'Номер документа должен быть строкой' })
  number?: string;

  @ApiPropertyOptional({ description: 'Дата выдачи документа в ISO формате', example: '2020-01-10T00:00:00.000Z' })
  @IsOptional()
  @IsDateString({}, { message: 'Дата выдачи должна быть в ISO формате' })
  issuedAt?: string;

  @ApiPropertyOptional({ description: 'Дата окончания действия документа в ISO формате', example: '2030-01-10T00:00:00.000Z' })
  @IsOptional()
  @IsDateString({}, { message: 'Дата окончания должна быть в ISO формате' })
  expiresAt?: string;

  @ApiPropertyOptional({ description: 'Данные формы документа в JSON. Перед сохранением будут зашифрованы.' })
  @IsOptional()
  @IsJSON({ message: 'Дополнительные данные должны быть валидным JSON' })
  metadataJson?: string;
}

export class UpdateDocumentDto {
  @ApiPropertyOptional({ description: 'Номер документа' })
  @IsOptional()
  @IsString({ message: 'Номер документа должен быть строкой' })
  number?: string;

  @ApiPropertyOptional({ description: 'Дата выдачи в ISO формате' })
  @IsOptional()
  @IsDateString({}, { message: 'Дата выдачи должна быть в ISO формате' })
  issuedAt?: string;

  @ApiPropertyOptional({ description: 'Дата окончания в ISO формате' })
  @IsOptional()
  @IsDateString({}, { message: 'Дата окончания должна быть в ISO формате' })
  expiresAt?: string;

  @ApiPropertyOptional({ description: 'Данные формы документа в JSON' })
  @IsOptional()
  @IsJSON({ message: 'Дополнительные данные должны быть валидным JSON' })
  metadataJson?: string;
}
