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

export const REPORTE_IPS_ESTADOS = ['GENERADO', 'DECLARADO', 'PAGADO', 'ANULADO'] as const;

export class GenerarReporteIpsDto {
  @ApiProperty({ description: 'ID de la liquidación mensual CERRADA del período' })
  @IsUUID()
  liquidacion_id!: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  observaciones?: string;
}

export class MarcarDeclaradoDto {
  @ApiProperty()
  @IsDateString()
  fecha_declaracion!: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  @Length(1, 40)
  numero_planilla_ips?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  observaciones?: string;
}

export class MarcarPagadoDto {
  @ApiProperty()
  @IsDateString()
  fecha_pago!: string;

  @ApiPropertyOptional({ description: 'Cuenta de tesorería desde la que se paga el IPS (requerida si la empresa usa Tesorería)' })
  @IsOptional()
  @IsUUID()
  cuenta_tesoreria_id?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  @Length(1, 255)
  comprobante_url?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  observaciones?: string;
}

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

export class ActualizarDetalleIpsDto {
  @ApiProperty({ description: 'Días trabajados del empleado (1-31)', minimum: 0, maximum: 31 })
  @IsInt()
  @Min(0)
  @Max(31)
  dias_trabajados!: number;
}

export class QueryReportesIpsDto {
  @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: REPORTE_IPS_ESTADOS })
  @IsOptional()
  @IsString()
  @IsIn(REPORTE_IPS_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;
}
