package com.ffii.fpsms.modules.stock.entity.projection

import org.springframework.beans.factory.annotation.Value
import java.math.BigDecimal
import java.time.LocalDateTime

interface InventoryInfo{
    val id: Long?
    @get:Value("#{target.item.id}")
    val itemId: Long?
    @get:Value("#{target.item.code}")
    val itemCode: String?
    @get:Value("#{target.item.name}")
    val itemName: String?
    @get:Value("#{target.item.type}")
    val itemType: String?
    //    @get:Value("#{target.qty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}")
//    @get:Value("#{target.onHandQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}")
    @get:Value("#{target.onHandQty}")
    val onHandQty: BigDecimal?
    //    @get:Value("#{target.onHoldQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}")
    @get:Value("#{target.onHoldQty}")
    val onHoldQty: BigDecimal?
    //    @get:Value("#{target.unavailableQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}")
    @get:Value("#{target.unavailableQty}")
    val unavailableQty: BigDecimal?
    //    @get:Value("#{(target.onHandQty - target.onHoldQty - target.unavailableQty) / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}")
    @get:Value("#{(target.onHandQty - target.onHoldQty - target.unavailableQty)}")
    val availableQty: BigDecimal?
    @get:Value("#{target.item.itemUoms.^[stockUnit == true && deleted == false]?.uom.code}")
    val uomCode: String?
    @get:Value("#{target.item.itemUoms.^[stockUnit == true && deleted == false]?.uom?.udfudesc}")
    val uomUdfudesc: String?
    @get:Value("#{target.item.itemUoms.^[stockUnit == true && deleted == false]?.uom?.udfShortDesc}")
    val uomShortDesc: String?
    //    @get:Value("#{target.qty * target.uom.gramPerSmallestUnit}")
//    val germPerSmallestUnit: BigDecimal?
    @get:Value("#{(target.onHandQty - target.onHoldQty - target.unavailableQty)}")
    val qtyPerSmallestUnit: BigDecimal?
    @get:Value("#{target.item.itemUoms.^[baseUnit == true && deleted == false]?.uom?.udfudesc}")
    val baseUom: String?
    //    @get:Value("#{target.qty * (target.uom.unit4 != '' ? target.uom.unit4Qty " +
//            ": target.uom.unit3 != '' ? target.uom.unit3Qty " +
//            ": target.uom.unit2 != '' ? target.uom.unit2Qty " +
//            ": target.uom.unit1Qty)}")
//    val qtyPerSmallestUnit: BigDecimal?
//    @get:Value("#{target.uom.unit4 != '' ? target.uom.unit4 " +
//            ": target.uom.unit3 != '' ? target.uom.unit3 " +
//            ": target.uom.unit2 != '' ? target.uom.unit2 " +
//            ": target.uom.unit1}")
//    val smallestUnit: String?
    val price: BigDecimal?
    @get:Value("#{target.currency?.name}")
    val currencyName: String?
    val status: String?
    @get:Value("#{target.item.latestMarketUnitPrice}")
    val latestMarketUnitPrice: Double?
    @get:Value("#{target.item.latestMupUpdatedDate}")
    val latestMupUpdatedDate: LocalDateTime?
}
