import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
import { IsBoolean, IsDateString, IsIn, IsOptional, IsString, Length } from 'class-validator';

const TIPOS_DATO = ['NUMERO', 'PORCENTAJE', 'TEXTO', 'BOOLEANO'] as const;

export class CreateParametroDto {
  @ApiProperty()
  @IsString()
  @Length(1, 50)
  clave!: string;

  @ApiProperty()
  @IsString()
  @Length(1, 100)
  nombre!: string;

  @ApiProperty()
  @IsString()
  valor!: string;

  @ApiProperty({ enum: TIPOS_DATO })
  @IsString()
  @IsIn(TIPOS_DATO as unknown as string[])
  tipo_dato!: (typeof TIPOS_DATO)[number];

  @ApiProperty()
  @IsString()
  @Length(1, 30)
  categoria!: string;

  @ApiPropertyOptional({ default: true })
  @IsOptional()
  @IsBoolean()
  editable?: boolean;

  @ApiProperty()
  @IsDateString()
  vigencia_desde!: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsDateString()
  vigencia_hasta?: string;
}

export class UpdateParametroDto extends PartialType(CreateParametroDto) {}

export class QueryParametrosDto {
  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  clave?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  categoria?: string;

  @ApiPropertyOptional({ description: 'Si true, devuelve sólo el valor vigente al día de hoy' })
  @IsOptional()
  vigente?: string | boolean;
}
