import { IsEmail, IsEnum, IsOptional, IsString, Length } from 'class-validator';
import { VerificationMethod, VerificationStatus } from '../enum/pes.enum';
import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
import { PesCampaignResponseDto } from './pes-campaign.dto';
import { PesEmailVerification } from '../entities/pes-email-verification.entity';

export class CreatePesEmailVerificationDto {
  @IsString()
  verificationId: string;

  @IsEmail()
  email: string;

  @IsOptional()
  @IsEnum(VerificationMethod)
  method?: VerificationMethod;

  @IsOptional()
  @IsEnum(VerificationStatus)
  status?: VerificationStatus;

  @IsOptional()
  @IsString()
  @Length(6, 6)
  otpCode?: string;

  @IsOptional()
  otpExpiresAt?: Date;

  @IsOptional()
  verifiedAt?: Date;
}

export class UpdatePesEmailVerificationDto extends PartialType(CreatePesEmailVerificationDto) {}

export class PesEmailVerificationResponseDto {
  @ApiProperty({ example: 'uuid-v4' })
  id: string;

  @ApiProperty()
  verificationId: string;

  @ApiProperty()
  email: string;

  @ApiProperty({ enum: VerificationMethod })
  method: VerificationMethod;

  @ApiProperty({ enum: VerificationStatus })
  status: VerificationStatus;

  @ApiProperty({ nullable: true })
  otpCode: string;

  @ApiProperty({ type: String, format: 'date-time', nullable: true })
  otpExpiresAt: Date;

  @ApiProperty({ type: String, format: 'date-time', nullable: true })
  verifiedAt: Date;

  @ApiProperty({ type: String, format: 'date-time' })
  createdAt: Date;

  @ApiProperty({ type: String, format: 'date-time' })
  updatedAt: Date;

  @ApiPropertyOptional({ type: () => [PesCampaignResponseDto] })
  campaigns?: PesCampaignResponseDto[];

  constructor(pesEmailVerification: PesEmailVerification) {
    this.id = pesEmailVerification.id;
    this.verificationId = pesEmailVerification.verificationId;
    this.email = pesEmailVerification.email;
    this.method = pesEmailVerification.method;
    this.status = pesEmailVerification.status;
    this.otpCode = pesEmailVerification.otpCode || null;
    this.otpExpiresAt = pesEmailVerification.otpExpiresAt || null;
    this.verifiedAt = pesEmailVerification.verifiedAt || null;
    this.createdAt = pesEmailVerification.createdAt;
    this.updatedAt = pesEmailVerification.updatedAt;
  }
}