import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  ArrayMinSize,
  IsArray,
  IsBoolean,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  Min,
  ValidateNested,
} from 'class-validator';

export class NotaCreditoCompraDetDto {
  @ApiPropertyOptional({ description: 'Ítem de la compra origen (para trazabilidad)' })
  @IsOptional()
  @IsUUID()
  compra_det_id?: string;

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

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  codigo_producto?: string;

  @ApiProperty()
  @IsString()
  @IsNotEmpty({ message: 'Descripción del ítem es obligatoria' })
  descripcion: string;

  @ApiProperty({ example: 1 })
  @IsNumber()
  @Min(0.0001, { message: 'La cantidad debe ser mayor a 0' })
  cantidad: number;

  @ApiProperty({ example: 100000 })
  @IsNumber()
  @Min(0)
  precio_unitario: number;

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

  @ApiPropertyOptional({ description: 'Si este ítem debe decrementar stock (devolución de mercadería)' })
  @IsOptional()
  @IsBoolean()
  afecta_stock?: boolean;
}

export class CreateNotaCreditoCompraDto {
  @ApiProperty()
  @IsUUID()
  @IsNotEmpty({ message: 'Proveedor es obligatorio' })
  proveedor_id: string;

  @ApiPropertyOptional({ description: 'Compra que esta NC ajusta (opcional)' })
  @IsOptional()
  @IsUUID()
  compra_id?: string;

  @ApiPropertyOptional({ description: 'Factura de gasto que esta NC ajusta (opcional, excluyente con compra_id)' })
  @IsOptional()
  @IsUUID()
  gasto_id?: string;

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

  @ApiPropertyOptional({ description: 'Depósito donde reponer/decrementar stock' })
  @IsOptional()
  @IsUUID()
  deposito_id?: string;

  // Documento del proveedor
  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  timbrado?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  establecimiento?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  punto_expedicion?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  numero?: string;

  @ApiPropertyOptional({ example: '2026-07-24' })
  @IsOptional()
  @IsString()
  fecha_emision?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  motivo?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsNumber()
  cotizacion?: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  observaciones?: string;

  @ApiProperty({ type: [NotaCreditoCompraDetDto] })
  @IsArray()
  @ArrayMinSize(1, { message: 'La nota de crédito debe tener al menos un ítem' })
  @ValidateNested({ each: true })
  @Type(() => NotaCreditoCompraDetDto)
  items: NotaCreditoCompraDetDto[];
}
