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

export const PRESTAMO_ESTADOS = ['ACTIVO', 'SUSPENDIDO', 'CANCELADO'] as const;
export const TIPOS_DESCUENTO = ['MENSUAL', 'QUINCENAL'] as const;
export const CUOTA_ESTADOS = ['PENDIENTE', 'DESCONTADO', 'REPROGRAMADO'] as const;

export class CreatePrestamoDto {
  @ApiProperty()
  @IsUUID()
  empleado_id!: string;

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

  @ApiProperty()
  @IsNumber()
  @Min(1)
  monto_total!: number;

  @ApiProperty()
  @IsInt()
  @Min(1)
  @Max(120)
  cantidad_cuotas!: number;

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

  @ApiProperty({ description: 'Fecha de la primera cuota (mes/año determina el período)' })
  @IsDateString()
  primer_descuento_en!: string;

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

export class UpdatePrestamoDto {
  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  observacion?: string;
}

export class CambiarEstadoPrestamoDto {
  @ApiProperty({ enum: PRESTAMO_ESTADOS })
  @IsString()
  @IsIn(PRESTAMO_ESTADOS as unknown as string[])
  estado!: (typeof PRESTAMO_ESTADOS)[number];

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

export class QueryPrestamosDto {
  @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: PRESTAMO_ESTADOS })
  @IsOptional()
  @IsString()
  @IsIn(PRESTAMO_ESTADOS as unknown as string[])
  estado?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  empleado_id?: string;
}

export class MarcarCuotaDescontadaDto {
  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  liquidacion_id?: string;

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