import {
  ArrayMaxSize,
  IsArray,
  IsIn,
  IsInt,
  IsISO8601,
  IsObject,
  IsOptional,
  IsString,
  IsUUID,
  Max,
  Min,
  ValidateNested,
} from 'class-validator';
import { Type } from 'class-transformer';

export class AuditEventAdvisorDto {
  @IsOptional()
  @IsString()
  name?: string;

  @IsOptional()
  @IsString()
  email?: string;

  @IsOptional()
  @IsString()
  plan?: string;
}

export class CreateAuditEventDto {
  @IsUUID('4')
  event_id: string;

  @IsString()
  event_name: string;

  @IsInt()
  @Min(1)
  @Max(20)
  event_version: number;

  @IsISO8601()
  timestamp: string;

  @IsIn(['web', 'api', 'mobile'])
  source: 'web' | 'api' | 'mobile';

  @IsString()
  actor_id: string;

  @IsIn(['advisor', 'client', 'unknown'])
  actor_role: 'advisor' | 'client' | 'unknown';

  @IsString()
  session_id: string;

  @IsString()
  correlation_id: string;

  @IsOptional()
  @IsObject()
  metadata?: Record<string, unknown>;

  @IsOptional()
  @ValidateNested()
  @Type(() => AuditEventAdvisorDto)
  advisor?: AuditEventAdvisorDto;
}

export class CreateAuditEventsBatchDto {
  @IsArray()
  @ArrayMaxSize(100)
  @ValidateNested({ each: true })
  @Type(() => CreateAuditEventDto)
  events: CreateAuditEventDto[];
}
