import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsArray, IsBoolean, IsIn, IsInt, IsNumber, IsOptional, IsString, IsUUID, Min } from 'class-validator';

export class CerrarVentaDto {
  @ApiPropertyOptional({ description: 'Cliente fiscal. Si la oportunidad cuelga de un lead, es obligatorio.' })
  @IsOptional()
  @IsUUID()
  cliente_id?: string;

  @ApiProperty({ enum: ['contado', 'credito'], default: 'contado' })
  @IsIn(['contado', 'credito'])
  condicion: string;

  @ApiPropertyOptional({ enum: ['plazo', 'cuotas'] })
  @IsOptional()
  @IsIn(['plazo', 'cuotas'])
  modalidad_credito?: string;

  @ApiPropertyOptional({ example: 30 })
  @IsOptional()
  @IsInt()
  @Min(1)
  plazo_dias?: number;

  @ApiPropertyOptional({ example: 3, description: 'Cantidad de cuotas.' })
  @IsOptional()
  @IsInt()
  @Min(1)
  cuotas?: number;

  @ApiPropertyOptional({
    description: 'Fuerza el paso por orden de venta aunque no haya entrega ni anticipo.',
  })
  @IsOptional()
  @IsBoolean()
  requiere_entrega?: boolean;

  @ApiPropertyOptional({ description: 'Anticipo cobrado. Obliga a pasar por orden de venta.' })
  @IsOptional()
  @IsNumber()
  @Min(0)
  anticipo?: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  deposito_id?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  numeracion_id?: string;

  @ApiPropertyOptional({ description: 'Texto libre que sale en la factura.' })
  @IsOptional()
  @IsString()
  info_adicional?: string;

  @ApiPropertyOptional({
    description:
      'Supervisor que autoriza pasar por encima del límite de crédito. Obligatorio si se envía ' +
      'el PIN: sin saber quién autoriza habría que probar el PIN contra todos los usuarios.',
  })
  @IsOptional()
  @IsUUID()
  supervisor_id?: string;

  @ApiPropertyOptional({
    description:
      'PIN del supervisor. Se valida con bcrypt contra usuario.pin_supervisor y exige el ' +
      'privilegio CRM_CIE_CREDITO_AUTORIZAR. Cada override aprobado queda en autorizaciones_caja.',
  })
  @IsOptional()
  @IsString()
  pin_supervisor?: string;

  @ApiPropertyOptional({ description: 'Reservado: ítems a facturar parcialmente. Todavía no implementado.' })
  @IsOptional()
  @IsArray()
  items?: unknown[];
}
