import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  IsArray,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  MaxLength,
  ValidateNested,
} from 'class-validator';
import { ChequeMobileDto, GeoMobileDto, TransferenciaMobileDto } from './crear-cobro-mobile.dto';

/**
 * DTO mobile que envuelve la distribución automática de pagos (`previewDistribucion`)
 * más los metadatos de cabecera necesarios para crear el recibo. Espejo simplificado
 * del flujo `CobrosTemplateV2` de la web.
 */
export class CrearDesdeDistribucionMobileDto {
  @ApiProperty({ description: 'Cliente al que se le cobra' })
  @IsUUID()
  cliente_id: string;

  @ApiProperty({ description: 'Sucursal del cobro (define numeración del recibo)' })
  @IsUUID()
  sucursal_id: string;

  @ApiPropertyOptional({ description: 'Sesión de caja abierta del cobrador' })
  @IsOptional()
  @IsUUID()
  sesion_caja_id?: string;

  // ----- Datos para previewDistribucion -----

  @ApiProperty({ type: [String], description: 'Cuotas seleccionadas a pagar' })
  @IsArray()
  @IsUUID('4', { each: true })
  cuota_ids: string[];

  @ApiProperty({ example: 150000, description: 'Monto total recibido del cliente' })
  @IsNumber()
  monto_recibido: number;

  @ApiPropertyOptional({
    example: 40000,
    deprecated: true,
    description:
      'DEPRECADO — se ignora. El interés manual se imputa automáticamente después ' +
      'del capital, con lo que sobra del monto entregado. Se mantiene para no ' +
      'rechazar cobros de clientes viejos que todavía lo mandan.',
  })
  @IsNumber()
  @IsOptional()
  interes_manual_monto?: number;

  @ApiProperty({ description: 'Medio de pago (de empresa_medio_pago activos)' })
  @IsUUID()
  medio_pago_id: string;

  @ApiPropertyOptional({ description: 'Moneda del cobro' })
  @IsOptional()
  @IsUUID()
  moneda_id?: string;

  @ApiPropertyOptional({ example: 7500 })
  @IsOptional()
  @IsNumber()
  cotizacion?: number;

  // ----- Descuentos (autorizados o libres) -----

  @ApiPropertyOptional({ example: 10 })
  @IsOptional()
  @IsNumber()
  descuento_porcentaje?: number;

  @ApiPropertyOptional({ example: 50000 })
  @IsOptional()
  @IsNumber()
  descuento_monto?: number;

  @ApiPropertyOptional({ example: 'Descuento autorizado' })
  @IsOptional()
  @IsString()
  @MaxLength(500)
  motivo_descuento?: string;

  @ApiPropertyOptional({
    description: 'ID de autorización de descuento aplicada (se marca como usada al confirmar)',
  })
  @IsOptional()
  @IsUUID()
  autorizacion_descuento_id?: string;

  // ----- Cheque / transferencia / geo / observación -----

  @ApiPropertyOptional({ type: ChequeMobileDto })
  @IsOptional()
  @ValidateNested()
  @Type(() => ChequeMobileDto)
  cheque?: ChequeMobileDto;

  @ApiPropertyOptional({ type: TransferenciaMobileDto })
  @IsOptional()
  @ValidateNested()
  @Type(() => TransferenciaMobileDto)
  transferencia?: TransferenciaMobileDto;

  @ApiPropertyOptional({ type: GeoMobileDto })
  @IsOptional()
  @ValidateNested()
  @Type(() => GeoMobileDto)
  geo?: GeoMobileDto;

  @ApiPropertyOptional({ example: 'Cobro en ruta' })
  @IsOptional()
  @IsString()
  observacion?: string;
}
