import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
import { inm_tramo_base, inm_tramo_tipo } from '@prisma/client';
import { Type } from 'class-transformer';
import {
  ArrayMaxSize,
  ArrayMinSize,
  IsArray,
  IsDateString,
  IsEnum,
  IsInt,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  Max,
  MaxLength,
  Min,
  ValidateNested,
} from 'class-validator';

export class TramoDto {
  @ApiPropertyOptional({ example: 1 }) @IsOptional() @IsInt() @Min(0) orden?: number;
  @ApiProperty({ enum: inm_tramo_tipo }) @IsEnum(inm_tramo_tipo) tipo: inm_tramo_tipo;
  @ApiProperty({ enum: inm_tramo_base, description: 'PORCENTAJE del precio, MONTO por cuota o SALDO (lo que falta)' })
  @IsEnum(inm_tramo_base)
  base: inm_tramo_base;
  @ApiProperty({ example: 10 }) @IsNumber({ maxDecimalPlaces: 4 }) @Min(0) valor: number;
  @ApiPropertyOptional({ example: 36 }) @IsOptional() @IsInt() @Min(1) @Max(600) cantidad?: number;
  @ApiPropertyOptional({ example: 1, description: 'Meses entre cuotas (1 mensual, 6 semestral, 12 anual)' })
  @IsOptional()
  @IsInt()
  @Min(1)
  @Max(60)
  periodicidad_meses?: number;
  @ApiPropertyOptional({ example: 1, description: 'Meses desde la firma hasta la primera cuota del tramo' })
  @IsOptional()
  @IsInt()
  @Min(0)
  @Max(600)
  inicio_meses?: number;
  @ApiPropertyOptional() @IsOptional() @IsUUID() hito_id?: string | null;
  @ApiPropertyOptional({ example: 'Refuerzo de fin de año' }) @IsOptional() @IsString() @MaxLength(150) descripcion?:
    | string
    | null;
}

export class CreatePlanDto {
  @ApiProperty() @IsUUID() proyecto_id: string;
  @ApiProperty({ example: 'Pozo 36 cuotas' }) @IsString() @IsNotEmpty() @MaxLength(100) nombre: string;
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(255) descripcion?: string;
  @ApiPropertyOptional() @IsOptional() @IsInt() @Min(0) orden?: number;

  @ApiProperty({ type: [TramoDto] })
  @IsArray()
  @ArrayMinSize(1)
  @ArrayMaxSize(30)
  @ValidateNested({ each: true })
  @Type(() => TramoDto)
  tramos: TramoDto[];
}

export class UpdatePlanDto extends PartialType(CreatePlanDto) {}

export class SimularPlanDto {
  @ApiPropertyOptional({ description: 'Plan guardado; o mandar los tramos sueltos' })
  @IsOptional()
  @IsUUID()
  plan_id?: string;

  @ApiPropertyOptional({ type: [TramoDto] })
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => TramoDto)
  tramos?: TramoDto[];

  @ApiProperty({ example: 80000 }) @IsNumber({ maxDecimalPlaces: 2 }) @Min(0.01) precio: number;
  @ApiPropertyOptional({ example: 'USD' }) @IsOptional() @IsString() @MaxLength(3) moneda_codigo?: string;
  @ApiPropertyOptional({ example: '2026-11-15' }) @IsOptional() @IsDateString() fecha_base?: string;
}
