import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger';
import { inm_adenda_tipo } from '@prisma/client';
import { Type } from 'class-transformer';
import {
  IsArray,
  IsDateString,
  IsEnum,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  Max,
  MaxLength,
  Min,
  ValidateNested,
} from 'class-validator';
import { TramoDto } from '../../planes/dto/plan.dto';

export class CrearAdendaDto {
  @ApiProperty({ enum: inm_adenda_tipo }) @IsEnum(inm_adenda_tipo) tipo: inm_adenda_tipo;
  @ApiProperty({ example: 'El comprador pidió estirar las cuotas por un cambio de trabajo' })
  @IsString()
  @IsNotEmpty()
  @MaxLength(500)
  motivo: string;

  @ApiPropertyOptional({ description: 'CAMBIO_PLAN / CAMBIO_UNIDAD: plan del proyecto para el saldo' })
  @IsOptional()
  @IsUUID()
  plan_id?: string;

  @ApiPropertyOptional({ type: [TramoDto], description: 'CAMBIO_PLAN / CAMBIO_UNIDAD: tramos a medida para el saldo' })
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => TramoDto)
  tramos?: TramoDto[];

  @ApiPropertyOptional({ example: '2026-11-15', description: 'Fecha base del nuevo cronograma. Por defecto, hoy.' })
  @IsOptional()
  @IsDateString()
  fecha_base?: string;

  @ApiPropertyOptional({ description: 'CAMBIO_UNIDAD: la unidad nueva (disponible)' })
  @IsOptional()
  @IsUUID()
  unidad_id?: string;

  @ApiPropertyOptional({
    example: 95000,
    description: 'CAMBIO_UNIDAD: precio de la unidad nueva. Por defecto, su precio de lista.',
  })
  @IsOptional()
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0.01)
  precio?: number;

  @ApiPropertyOptional({ description: 'CESION: cliente que recibe los derechos (tiene que ser facturable)' })
  @IsOptional()
  @IsUUID()
  cliente_id?: string;

  @ApiPropertyOptional({
    example: 10,
    description: 'RESCISION: % de lo cobrado que retiene la empresa. Por defecto, el de los parámetros.',
  })
  @IsOptional()
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0)
  @Max(100)
  pct_retencion?: number;
}

export class RechazarAdendaDto {
  @ApiProperty({ example: 'El comprador tiene cuotas vencidas: primero que regularice' })
  @IsString()
  @IsNotEmpty()
  @MaxLength(500)
  motivo: string;
}

/** Vista previa: los mismos datos sin el motivo, que se escribe recién al pedirla. */
export class PreviewAdendaDto extends OmitType(CrearAdendaDto, ['motivo'] as const) {
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(500) motivo?: string;
}
