package com.aegis.emergency.dispatch.service;

import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.aegis.emergency.dispatch.domain.DispatchResourceUsageLink;
import com.aegis.emergency.dispatch.dto.MaterialAllocationRequest;
import com.aegis.emergency.dispatch.dto.EquipmentAllocationRequest;
import com.aegis.emergency.dispatch.dto.VehicleAllocationRequest;

/**
 * 调度任务资源 usage 关联 Service 接口
 *
 * 负责协调资源模块的 usage 记录与调度任务之间的关联
 *
 * @author aegis
 */
public interface IDispatchResourceUsageLinkService extends IService<DispatchResourceUsageLink> {

    /**
     * 根据任务ID查询资源链接
     *
     * @param taskId 任务ID
     * @return 资源链接集合
     */
    List<DispatchResourceUsageLink> listByTaskId(Long taskId);

    /**
     * 根据行动项ID查询资源链接
     *
     * @param stepId 行动项ID
     * @return 资源链接集合
     */
    List<DispatchResourceUsageLink> listByStepId(Long stepId);

    /**
     * 根据任务ID与资源类型查询资源链接
     *
     * @param taskId 任务ID
     * @param resourceType 资源类型（equipment/material/vehicle）
     * @return 资源链接集合
     */
    List<DispatchResourceUsageLink> listByTaskAndType(Long taskId, String resourceType);

    /**
     * 分配物资到行动项（调用物资服务创建 usage，并建立关联）
     *
     * @param taskId 任务ID
     * @param stepId 行动项ID
     * @param request 物资分配请求
     * @return 资源链接
     */
    DispatchResourceUsageLink allocateMaterialToStep(Long taskId, Long stepId, MaterialAllocationRequest request);

    /**
     * 分配装备到行动项（调用装备服务创建 usage，并建立关联）
     *
     * @param taskId 任务ID
     * @param stepId 行动项ID
     * @param request 装备分配请求
     * @return 资源链接
     */
    DispatchResourceUsageLink allocateEquipmentToStep(Long taskId, Long stepId, EquipmentAllocationRequest request);

    /**
     * 分配车辆到行动项（调用车辆服务创建 usage，并建立关联）
     *
     * @param taskId 任务ID
     * @param stepId 行动项ID
     * @param request 车辆分配请求
     * @return 资源链接
     */
    DispatchResourceUsageLink allocateVehicleToStep(Long taskId, Long stepId, VehicleAllocationRequest request);

    /**
     * 解除资源关联（同时可选通知资源模块释放 usage）
     *
     * @param taskId 任务ID
     * @param linkId 资源链接ID
     * @return 是否成功
     */
    boolean detachResource(Long taskId, Long linkId);

    /**
     * 释放锁定的物资（无需使用，直接返还占用名额）
     *
     * @param taskId 任务ID
     * @param linkId 资源链接ID
     * @return 是否成功
     */
    boolean releaseMaterialLink(Long taskId, Long linkId);

    /**
     * 消耗物资（一次性物资出库）
     *
     * @param taskId 任务ID
     * @param linkId 资源链接ID
     * @return 是否成功
     */
    boolean consumeMaterialLink(Long taskId, Long linkId);

    /**
     * 归还物资（可重复使用物资闭环）
     *
     * @param taskId 任务ID
     * @param linkId 资源链接ID
     * @return 是否成功
     */
    boolean returnMaterialLink(Long taskId, Long linkId);
}