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

export const PLANILLA_ESTADOS = ['IMPORTADA', 'APLICADA', 'ANULADA'] as const;

export class ImportarPlanillaDto {
  @ApiProperty({ description: 'Nombre descriptivo de la planilla (ej: Bonos noviembre 2026)' })
  @IsString()
  @Length(1, 150)
  nombre!: string;

  @ApiProperty()
  @Transform(({ value }) => parseInt(String(value), 10))
  @IsInt()
  @Min(2000)
  @Max(2100)
  periodo_anio!: number;

  @ApiProperty()
  @Transform(({ value }) => parseInt(String(value), 10))
  @IsInt()
  @Min(1)
  @Max(12)
  periodo_mes!: number;
}

export class QueryPlanillasDto {
  @ApiPropertyOptional({ default: 1 })
  @IsOptional()
  @Transform(({ value }) => parseInt(String(value), 10) || 1)
  @IsInt()
  @Min(1)
  page?: number = 1;

  @ApiPropertyOptional({ default: 20 })
  @IsOptional()
  @Transform(({ value }) => parseInt(String(value), 10) || 20)
  @IsInt()
  @Min(1)
  @Max(200)
  limit?: number = 20;

  @ApiPropertyOptional({ enum: PLANILLA_ESTADOS })
  @IsOptional()
  @IsString()
  @IsIn(PLANILLA_ESTADOS as unknown as string[])
  estado?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @Transform(({ value }) => (value ? parseInt(String(value), 10) : undefined))
  @IsInt()
  periodo_anio?: number;

  @ApiPropertyOptional()
  @IsOptional()
  @Transform(({ value }) => (value ? parseInt(String(value), 10) : undefined))
  @IsInt()
  periodo_mes?: number;
}

export class AnularPlanillaDto {
  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  comentario?: string;
}
