package com.aegis.resource.material.service;

import com.aegis.resource.material.domain.MaterialInventory;
import com.aegis.resource.material.dto.InventoryAction;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;

/**
 * 物资库存Service接口（MyBatis-Plus风格）
 * 
 * @author aegis
 */

public interface IResourceMaterialInventoryService extends IService<MaterialInventory> {

    /**
     * 条件查询库存列表
     *
     * @param condition 查询条件
     * @return 库存集合
     */
    List<MaterialInventory> listByCondition(MaterialInventory condition);

    /**
     * 根据物资ID查询库存列表
     *
     * @param materialId 物资ID
     * @return 库存集合
     */
    List<MaterialInventory> listByMaterialId(Long materialId);

    /**
     * 添加库存（指定仓库和数量）
     *
     * @param inventory 库存信息
     * @return 是否成功
     */
    boolean addInventory(MaterialInventory inventory);

    /**
     * 占用库存（需指定仓库ID）
     * 
     * @param materialId 物资ID
     * @param warehouseId 仓库ID
     * @param qty 占用数量
     * @param eventId 事件ID（可选）
     * @param taskId 任务ID（可选）
     * @param remark 备注
     * @return 是否成功
     */
    boolean lockInventory(InventoryAction action);

    /**
     * 释放库存（需指定仓库ID）
     * 
     * @param materialId 物资ID
     * @param warehouseId 仓库ID
     * @param qty 释放数量
     * @param eventId 事件ID（可选）
     * @param taskId 任务ID（可选）
     * @param remark 备注
     * @return 是否成功
     */
    boolean unlockInventory(InventoryAction action);

    /**
     * 消耗结算（一次性物资，需指定仓库ID）
     * 
     * @param materialId 物资ID
     * @param warehouseId 仓库ID
     * @param qty 消耗数量
     * @param eventId 事件ID（可选）
     * @param taskId 任务ID（可选）
     * @param remark 备注
     * @return 是否成功
     */
    boolean consumeInventory(InventoryAction action);

    /**
     * 归还入库（可重复使用物资，需指定仓库ID）
     * 
     * @param materialId 物资ID
     * @param warehouseId 仓库ID
     * @param qty 归还数量
     * @param eventId 事件ID（可选）
     * @param taskId 任务ID（可选）
     * @param remark 备注
     * @return 是否成功
     */
    boolean returnInventory(InventoryAction action);

    /**
     * 库存调整（用于盘点、损失、发现等非业务流操作）
     * 
     * @param adjustment 调整信息（包含物资ID、仓库ID、调整数量、原因、备注）
     * @return 是否成功
     */
    boolean adjustInventory(com.aegis.resource.material.dto.InventoryAdjustment adjustment);
}