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

export class OrdenCompraCabeceraDto {
  @ApiProperty({ description: 'Sucursal de la operación' })
  @IsUUID()
  @IsNotEmpty()
  sucursal_id: string;

  @ApiProperty({ description: 'Proveedor' })
  @IsUUID()
  @IsNotEmpty()
  proveedor_id: string;

  @ApiPropertyOptional({ description: 'Requisición origen (si aplica)' })
  @IsOptional()
  @IsUUID()
  requisicion_id?: string;

  @ApiPropertyOptional({ description: 'Moneda' })
  @IsOptional()
  @IsUUID()
  moneda_id?: string;

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

  @ApiPropertyOptional({ description: 'Fecha de entrega estimada (YYYY-MM-DD)' })
  @IsOptional()
  @IsDateString()
  fecha_entrega?: string;

  @ApiPropertyOptional({ description: 'Cotización' })
  @IsOptional()
  @IsNumber({ maxDecimalPlaces: 6 })
  @Min(0)
  cotizacion?: number;

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

export class OrdenCompraItemDto {
  @ApiPropertyOptional({ description: 'Centro de costo (obligatorio si CONTABILIDAD está habilitado)' })
  @IsOptional()
  @IsUUID()
  centro_costo_id?: string;

  @ApiPropertyOptional({ description: 'Detalle de requisición origen (si aplica)' })
  @IsOptional()
  @IsUUID()
  requisicion_det_id?: string;

  @ApiPropertyOptional({ description: 'Producto (opcional para ítems libres)' })
  @IsOptional()
  @IsUUID()
  producto_id?: string;

  @ApiProperty({ description: 'Descripción del ítem' })
  @IsString()
  @IsNotEmpty()
  @MaxLength(500)
  descripcion: string;

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

  @ApiProperty({ description: 'Precio unitario' })
  @IsNumber({ maxDecimalPlaces: 4 })
  @Min(0)
  precio_unitario: number;

  @ApiPropertyOptional({ description: 'IVA % (0, 5, 10)', default: 10 })
  @IsOptional()
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0)
  porcentaje_iva?: number;
}

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

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