import { Transform, Type } from 'class-transformer';
import {
  IsBoolean,
  IsIn,
  IsInt,
  IsOptional,
  IsString,
  Max,
  MaxLength,
  Min,
} from 'class-validator';

import {
  normalizeRgcDecisionStatus,
  RGC_DECISION_STATUS_VALUES,
} from './create-rgc-decision.dto';

function parseBoolean(value: unknown): boolean | undefined {
  if (value === undefined || value === null || value === '') {
    return undefined;
  }

  if (typeof value === 'boolean') {
    return value;
  }

  if (typeof value === 'string') {
    return ['true', '1', 'yes'].includes(value.trim().toLowerCase());
  }

  return false;
}

export class RgcDecisionQueryDto {
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  page?: number = 1;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  @Max(100)
  limit?: number = 10;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  plenaryId?: number;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  stakeholderId?: number;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  indicatorId?: number;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  categoryId?: number;

  @IsOptional()
  @Transform(({ value }: { value: unknown }) =>
    normalizeRgcDecisionStatus(value),
  )
  @IsIn(RGC_DECISION_STATUS_VALUES)
  status?: string;

  @IsOptional()
  @Transform(({ value }: { value: unknown }) => parseBoolean(value))
  @IsBoolean()
  ministryOnly?: boolean;

  @IsOptional()
  @IsString()
  @MaxLength(255)
  search?: string;
}
