import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { presupuesto_item_tipo, presupuesto_iva_categoria } from '@prisma/client';
import {
  IsEnum,
  IsInt,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  Max,
  MaxLength,
  Min,
} from 'class-validator';

export class PresupuestoItemDto {
  @ApiPropertyOptional({ example: 1, description: 'Orden de la línea (1, 2, 3...)' })
  @IsInt()
  @Min(1)
  @IsOptional()
  orden?: number;

  @ApiProperty({ enum: presupuesto_item_tipo, example: presupuesto_item_tipo.PRODUCTO })
  @IsEnum(presupuesto_item_tipo)
  tipo: presupuesto_item_tipo;

  @ApiPropertyOptional({ example: 'uuid', description: 'Producto del catálogo (si aplica)' })
  @IsUUID()
  @IsOptional()
  producto_id?: string;

  @ApiProperty({ example: 'Notebook Lenovo ThinkPad E14' })
  @IsString()
  @IsNotEmpty({ message: 'La descripción del ítem es obligatoria' })
  descripcion: string;

  @ApiPropertyOptional({ example: 'Garantía 12 meses' })
  @IsString()
  @IsOptional()
  notas_item?: string;

  @ApiPropertyOptional({ example: 2 })
  @IsNumber({ maxDecimalPlaces: 4 })
  @Min(0)
  @IsOptional()
  cantidad?: number;

  @ApiPropertyOptional({ example: 'unid' })
  @IsString()
  @MaxLength(30)
  @IsOptional()
  unidad_medida?: string;

  @ApiPropertyOptional({ example: 4500000, description: 'Precio unitario con IVA incluido' })
  @IsNumber({ maxDecimalPlaces: 4 })
  @Min(0)
  @IsOptional()
  precio_unitario?: number;

  @ApiPropertyOptional({ example: 5, description: 'Descuento de la línea (0–100%)' })
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0)
  @Max(100)
  @IsOptional()
  descuento_pct?: number;

  @ApiPropertyOptional({ example: 50000, description: 'Descuento por monto fijo sobre el bruto del ítem. Si > 0, prevalece sobre descuento_pct.' })
  @IsNumber({ maxDecimalPlaces: 4 })
  @Min(0)
  @IsOptional()
  descuento_monto?: number;

  @ApiPropertyOptional({ enum: presupuesto_iva_categoria, example: presupuesto_iva_categoria.IVA_10 })
  @IsEnum(presupuesto_iva_categoria)
  @IsOptional()
  iva_categoria?: presupuesto_iva_categoria;
}
