import { ApiPropertyOptional } from '@nestjs/swagger';
import { Transform, Type } from 'class-transformer';
import { IsArray, IsIn, IsInt, IsOptional, IsString, IsUUID, Max, Min } from 'class-validator';

/** Query param que llega como "a,b,c" (igual que /productos) o repetido; siempre sale como string[]. */
const aListaDeIds = ({ value }: { value: unknown }): string[] | undefined => {
  if (value == null || value === '') return undefined;
  const items = Array.isArray(value) ? value : String(value).split(',');
  const limpios = items.map((v) => String(v).trim()).filter(Boolean);
  return limpios.length ? limpios : undefined;
};

export const ESTADOS_SUGERIDA = ['SUGERIDA', 'APROBADA', 'RECHAZADA'] as const;
export type EstadoSugerida = (typeof ESTADOS_SUGERIDA)[number];

export class ListarSugerenciasDto {
  @ApiPropertyOptional({ enum: ESTADOS_SUGERIDA, default: 'SUGERIDA' })
  @IsOptional()
  @IsIn(ESTADOS_SUGERIDA)
  estado?: EstadoSugerida = 'SUGERIDA';

  @ApiPropertyOptional() @IsOptional() @IsUUID() busqueda_id?: string;

  @ApiPropertyOptional({ description: 'Una o varias categorías, separadas por coma' })
  @IsOptional()
  @Transform(aListaDeIds)
  @IsArray()
  @IsUUID('4', { each: true })
  categoria_id?: string[];

  @ApiPropertyOptional({ description: 'Una o varias marcas, separadas por coma' })
  @IsOptional()
  @Transform(aListaDeIds)
  @IsArray()
  @IsUUID('4', { each: true })
  marca_id?: string[];
  @ApiPropertyOptional({ description: 'Texto en descripción o código' }) @IsOptional() @IsString() q?: string;

  @ApiPropertyOptional({ default: 1 }) @IsOptional() @Type(() => Number) @IsInt() @Min(1) page?: number = 1;
  @ApiPropertyOptional({ default: 20 }) @IsOptional() @Type(() => Number) @IsInt() @Min(1) @Max(100) limit?: number = 20;
}
