import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  IsArray,
  IsIn,
  Max,
  Min,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  ValidateNested,
} from 'class-validator';
import { CreatePedidoItemDto } from './create-pedido-item.dto';

export class CreateOrdenVentaDto {
  @ApiProperty({ description: 'ID del cliente' })
  @IsNotEmpty()
  @IsUUID()
  cliente_id: string;

  @ApiPropertyOptional({ description: 'ID de la sucursal' })
  @IsOptional()
  @IsUUID()
  sucursal_id?: string;

  @ApiPropertyOptional({ description: 'ID del depósito por defecto' })
  @IsOptional()
  @IsUUID()
  deposito_id?: string;

  @ApiPropertyOptional({ description: 'ID del vendedor' })
  @IsOptional()
  @IsUUID()
  vendedor_id?: string;

  @ApiPropertyOptional({ description: 'ID de la moneda' })
  @IsOptional()
  @IsUUID()
  moneda_id?: string;

  @ApiPropertyOptional({ description: 'Tipo de cambio congelado (Gs por unidad de la moneda extranjera). Se arrastra desde el presupuesto.' })
  @IsOptional()
  @IsNumber()
  tipo_cambio?: number;

  @ApiPropertyOptional({ description: 'Descuento global de la orden en porcentaje (0-100)' })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Max(100)
  descuento_global_porcentaje?: number;

  @ApiPropertyOptional({ description: 'ID de la condición de pago (condiciones_pago de la empresa)' })
  @IsOptional()
  @IsUUID()
  condicion_pago_id?: string;

  @ApiPropertyOptional({ description: 'ID de la lista de precios' })
  @IsOptional()
  @IsUUID()
  lista_precios_id?: string;

  @ApiPropertyOptional({ description: 'Observaciones' })
  @IsOptional()
  @IsString()
  observaciones?: string;

  @ApiPropertyOptional({ description: 'Referencia interna' })
  @IsOptional()
  @IsString()
  referencia_interna?: string;

  @ApiPropertyOptional({ description: 'Fecha de vencimiento de la orden (YYYY-MM-DD)' })
  @IsOptional()
  @IsString()
  fecha_venc_orden?: string;

  @ApiPropertyOptional({
    description: 'Modalidad de facturación',
    enum: ['total', 'parcial_item', 'parcial_monto'],
    default: 'total',
  })
  @IsOptional()
  @IsIn(['total', 'parcial_item', 'parcial_monto'])
  tipo_facturacion?: string;

  @ApiPropertyOptional({ description: 'Items de la orden', type: [CreatePedidoItemDto] })
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => CreatePedidoItemDto)
  items?: CreatePedidoItemDto[];
}
