import { IsOptional, IsString, IsInt, Min, Max, IsIn } from 'class-validator';

export class PaginationQuery {
  @IsOptional() @IsInt() @Min(1) page?: number;
  @IsOptional() @IsInt() @Min(1) @Max(100) limit?: number;
  @IsOptional() @IsString() sortBy?: string;
  @IsOptional() @IsIn(['asc', 'desc']) order?: 'asc' | 'desc';
}

export class EventFilterQuery extends PaginationQuery {
  @IsOptional() @IsString() userId?: string;
  @IsOptional() @IsString() materialId?: string;
  @IsOptional() @IsString() readingTargetType?: string;
  @IsOptional() @IsString() eventType?: string;
  @IsOptional() @IsString() status?: string;
  @IsOptional() @IsString() startDate?: string;
  @IsOptional() @IsString() endDate?: string;
}

export class SessionFilterQuery extends PaginationQuery {
  @IsOptional() @IsString() userId?: string;
  @IsOptional() @IsString() materialId?: string;
  @IsOptional() @IsString() status?: string;
  @IsOptional() @IsString() clientSessionId?: string;
  @IsOptional() @IsString() startDate?: string;
  @IsOptional() @IsString() endDate?: string;
}

export class ProgressFilterQuery extends PaginationQuery {
  @IsOptional() @IsString() userId?: string;
  @IsOptional() @IsString() materialId?: string;
  @IsOptional() @IsString() status?: string;
}

export class RecordFilterQuery extends PaginationQuery {
  @IsOptional() @IsString() userId?: string;
  @IsOptional() @IsString() recordType?: string;
  @IsOptional() @IsString() startDate?: string;
  @IsOptional() @IsString() endDate?: string;
}

export class BatchReprocessDto {
  @IsString({ each: true }) eventIds!: string[];
}

export class RecalculateDto {
  @IsOptional() @IsString() userId?: string;
}

export class EventConfigDto {
  @IsOptional() @IsInt() dedupWindowMinutes?: number;
  @IsOptional() @IsInt() batchSize?: number;
  @IsOptional() @IsInt() retryMaxAttempts?: number;
}
