import { ApiProperty } from "@nestjs/swagger";
import { IsArray, IsDefined, IsInt, IsNotEmpty, IsNumber, IsObject, IsOptional } from "class-validator";
import { EsPit } from "../interfaces/es-pit.interface";
import { EsQuery } from "../interfaces/es-query.interface"

/**
 * List of allowed properties in this DTO
 */
 const allowedProperties = ['size', 'query', 'pit', 'sort'];

 /**
  * Elasticsearch query DTO
  */
 export class EsQueryDto {
     /**
      * Maximum number of elements returned by Elasticsearch
      */
     @IsOptional()
     @IsDefined()
     @IsNumber()
     @IsInt()
     @ApiProperty({
         description: 'Maximum number of elements returned by Elasticsearch',
         example: 30
     })
     size?: number;
     
     /**
      * The search query object passed to Elasticsearch
      */
     @IsDefined()
     @IsObject()
     @ApiProperty({
         description: 'Search query object passed to Elasticsearch',
         example: {},
     })
     query: EsQuery;

     /**
      * Object, that stores PIT ID and time alive
      */
     @IsOptional()
     @IsObject()
     @ApiProperty({
        description: 'PIT object',
        example: {}
     })
     pit?: EsPit;

     /**
      * Sorting info
      */
     @IsOptional()
     @IsArray()
     @ApiProperty({
        description: '',
        example: []
     })
     sort?: unknown[];

     /**
      * Pagination info
      */
     @IsOptional()
     @IsArray()
     @ApiProperty({
        description: '',
        example: []
     })
     search_after?: unknown[];

     /**
      * Constructs an empty object
      */
     constructor() {
        this.size = 10;
        this.query = undefined;
        this.pit = undefined;
        this.sort = undefined;
        this.search_after = undefined;
     }
 }