import { IsArray, IsBoolean, IsEnum, IsInt, IsOptional, IsString, Min } from 'class-validator';
import { ApiPropertyOptional } from '@nestjs/swagger';
import { Transform } from 'class-transformer';
import { parseBoolean } from '@/utils/parse-boolean';
import { IAccountsStructureType } from '../Accounts.types';
import { IFilterRole, ISortOrder } from '@/modules/DynamicListing/DynamicFilter/DynamicFilter.types';
import { ToNumber } from '@/common/decorators/Validators';

export class GetAccountsQueryDto {
  @ApiPropertyOptional({
    type: Boolean,
    description: 'Filter to show only inactive accounts',
    default: false,
  })
  @IsOptional()
  @IsBoolean()
  @Transform(({ value }) => parseBoolean(value, false))
  onlyInactive?: boolean;

  @ApiPropertyOptional({
    enum: IAccountsStructureType,
    description: 'Structure type for the accounts list',
    default: IAccountsStructureType.Tree,
  })
  @IsOptional()
  @IsEnum(IAccountsStructureType)
  structure?: IAccountsStructureType;

  @ApiPropertyOptional({
    description: 'Custom view ID',
    type: Number,
    example: 1,
  })
  @IsOptional()
  @ToNumber()
  @IsInt()
  customViewId?: number;

  @ApiPropertyOptional({
    description: 'Filter roles array',
    type: Array,
    isArray: true,
  })
  @IsArray()
  @IsOptional()
  filterRoles?: IFilterRole[];

  @ApiPropertyOptional({
    description: 'Column to sort by',
    type: String,
    example: 'created_at',
  })
  @IsOptional()
  @IsString()
  columnSortBy?: string;

  @ApiPropertyOptional({
    description: 'Sort order',
    enum: ISortOrder,
    example: ISortOrder.DESC,
  })
  @IsOptional()
  @IsEnum(ISortOrder)
  sortOrder?: string;

  @ApiPropertyOptional({
    description: 'Stringified filter roles',
    type: String,
    example: '{"fieldKey":"root_type","value":"asset"}',
  })
  @IsOptional()
  @IsString()
  stringifiedFilterRoles?: string;

  @ApiPropertyOptional({
    description: 'Search keyword',
    type: String,
    example: 'bank account',
  })
  @IsOptional()
  @IsString()
  searchKeyword?: string;

  @ApiPropertyOptional({
    description: 'View slug',
    type: String,
    example: 'assets',
  })
  @IsOptional()
  @IsString()
  viewSlug?: string;

  @ApiPropertyOptional({
    description: 'Page number',
    type: Number,
    example: 1,
    minimum: 1,
  })
  @IsOptional()
  @ToNumber()
  @IsInt()
  @Min(1)
  page?: number;

  @ApiPropertyOptional({
    description: 'Page size',
    type: Number,
    example: 25,
    minimum: 1,
  })
  @IsOptional()
  @ToNumber()
  @IsInt()
  @Min(1)
  pageSize?: number;
}

