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

export class RecepcionCompraCabeceraDto {
  @ApiPropertyOptional({ description: 'Orden de compra. Obligatoria cuando el flujo de OC está habilitado' })
  @IsOptional()
  @IsUUID()
  orden_compra_id?: string;

  @ApiPropertyOptional({ description: 'Proveedor. Obligatorio para recepciones libres' })
  @IsOptional()
  @IsUUID()
  proveedor_id?: string;

  @ApiPropertyOptional({
    description:
      'Depósito receptor en una recepción libre. En recepciones vinculadas se utiliza el depósito definido por la Orden de Compra',
  })
  @IsOptional()
  @IsUUID()
  deposito_id?: string;

  @ApiPropertyOptional({ description: 'Fecha de recepción (YYYY-MM-DD)' })
  @IsOptional()
  @IsDateString()
  fecha_recepcion?: string;

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

export class RecepcionCompraDetalleDto {
  @ApiPropertyOptional({ description: 'Detalle de orden de compra. Obligatorio en recepciones vinculadas a OC' })
  @IsOptional()
  @IsUUID()
  orden_compra_det_id?: string;

  @ApiPropertyOptional({ description: 'Producto. Obligatorio para recepciones libres' })
  @IsOptional()
  @IsUUID()
  producto_id?: string;

  @ApiProperty({ description: 'Cantidad recibida' })
  @IsNumber({ maxDecimalPlaces: 4 })
  @Min(0.0001)
  cantidad_recibida: number;

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

export class CreateRecepcionCompraDto {
  @ApiProperty({ type: RecepcionCompraCabeceraDto })
  @ValidateNested()
  @Type(() => RecepcionCompraCabeceraDto)
  cabecera: RecepcionCompraCabeceraDto;

  @ApiProperty({ type: [RecepcionCompraDetalleDto] })
  @IsArray()
  @ArrayMinSize(1)
  @ValidateNested({ each: true })
  @Type(() => RecepcionCompraDetalleDto)
  detalles: RecepcionCompraDetalleDto[];
}
