import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  ArrayMinSize,
  IsArray,
  IsDateString,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  Max,
  MaxLength,
  Min,
  ValidateNested,
} from 'class-validator';
import { PresupuestoItemDto } from './presupuesto-item.dto';

export class CreatePresupuestoDto {
  @ApiProperty({ example: 'uuid', description: 'Cliente del catálogo CxC' })
  @IsUUID()
  @IsNotEmpty({ message: 'El cliente es obligatorio' })
  cliente_id: string;

  @ApiPropertyOptional({ example: 'Ing. Pérez', description: 'Persona a quien va dirigido' })
  @IsString()
  @MaxLength(200)
  @IsOptional()
  contacto_cliente?: string;

  @ApiPropertyOptional({ example: 'uuid', description: 'Vendedor responsable (vendedores_cobradores)' })
  @IsUUID()
  @IsOptional()
  vendedor_id?: string;

  @ApiProperty({ example: 'Equipamiento oficinas planta 2' })
  @IsString()
  @IsNotEmpty({ message: 'El título es obligatorio' })
  @MaxLength(200)
  titulo: string;

  @ApiPropertyOptional({ example: 'uuid', description: 'Sucursal del presupuesto (define la numeración por sucursal)' })
  @IsUUID()
  @IsOptional()
  sucursal_id?: string;

  @ApiPropertyOptional({ example: 'uuid', description: 'Moneda del presupuesto (default = moneda base de la empresa)' })
  @IsUUID()
  @IsOptional()
  moneda_id?: string;

  @ApiPropertyOptional({ example: 7400, description: 'Tipo de cambio USD/PYG congelado al emitir' })
  @IsNumber({ maxDecimalPlaces: 4 })
  @Min(0)
  @IsOptional()
  tipo_cambio_usd?: number;

  @ApiPropertyOptional({ example: '2026-06-30', description: 'Fecha de vigencia (si no se envía, se calcula con días de vigencia de M36)' })
  @IsDateString()
  @IsOptional()
  fecha_vigencia?: string;

  @ApiPropertyOptional({ example: 'Contado contra entrega', description: 'Texto libre o snapshot de la condición seleccionada' })
  @IsString()
  @IsOptional()
  condicion_pago?: string;

  @ApiPropertyOptional({ example: 'uuid', description: 'Condición de pago del catálogo único (condiciones_pago, pantalla Métodos de Pago)' })
  @IsUUID()
  @IsOptional()
  condicion_pago_id?: string;

  @ApiPropertyOptional({ example: 'Garantía de 12 meses. Entrega en 5 días hábiles.' })
  @IsString()
  @IsOptional()
  notas_cliente?: string;

  @ApiPropertyOptional({ example: 'Margen ajustado, aprobar con gerencia' })
  @IsString()
  @IsOptional()
  observaciones_internas?: string;

  @ApiPropertyOptional({ example: 5, description: 'Descuento global del presupuesto (0–100%)' })
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0)
  @Max(100)
  @IsOptional()
  descuento_global_pct?: number;

  @ApiProperty({ type: [PresupuestoItemDto] })
  @IsArray()
  @ArrayMinSize(1, { message: 'El presupuesto debe tener al menos un ítem' })
  @ValidateNested({ each: true })
  @Type(() => PresupuestoItemDto)
  items: PresupuestoItemDto[];
}
