import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  ArrayMaxSize,
  ArrayMinSize,
  IsArray,
  IsEnum,
  IsISO8601,
  IsObject,
  IsOptional,
  IsString,
  ValidateNested,
} from 'class-validator';
import { TrackingEventType } from '../../common/constants/enums';

export class TrackingEventMetadataDto {
  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  lastPointAt?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  reason?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  platform?: string;
}

export class TrackingEventItemDto {
  @ApiProperty({ enum: TrackingEventType })
  @IsEnum(TrackingEventType)
  type: TrackingEventType;

  @ApiProperty()
  @IsISO8601()
  timestamp: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  legId?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  sessionId?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsObject()
  metadata?: TrackingEventMetadataDto;
}

export class TrackingEventsBatchDto {
  @ApiProperty({ type: [TrackingEventItemDto] })
  @IsArray()
  @ArrayMinSize(1)
  @ArrayMaxSize(100)
  @ValidateNested({ each: true })
  @Type(() => TrackingEventItemDto)
  events: TrackingEventItemDto[];
}
