package com.wms_main.service.business;

import com.wms_main.model.po.TAppAgvLock;

/**
 * AGV资源锁定服务接口
 * 管理入库口和出库口的AGV设备互锁机制
 */
public interface IAgvLockService {
    
    /**
     * AGV就位并放货后，锁定入库口
     * @param agvId AGV设备ID
     * @param inboundPort 入库口编号
     * @return 锁定结果：成功返回锁定记录，失败返回null
     */
    TAppAgvLock lockInboundPort(String agvId, String inboundPort);

    /**
     * 检查入库口是否可以上料（MES系统调用）
     * @param inboundPort 入库口编号
     * @return 是否可以上料
     */
    boolean canFeedToInboundPort(String inboundPort);
    
    /**
     * 获取当前入库口处理中的任务数量
     * @param inboundPort 入库口编号
     * @return 处理中的任务数量
     */
    int getProcessingTaskCount(String inboundPort);
    
    /**
     * 获取入库口状态描述
     * @param inboundPort 入库口编号
     * @return 状态描述（空闲/占用）
     */
    String getInboundPortStatus(String inboundPort);
    
    /**
     * 清理超时锁定
     * @return 清理的记录数
     */
    int cleanTimeoutLocks();
    
    /**
     * 释放指定入库口的所有活动锁定
     * @param inboundPort 入库口编号
     * @return 释放的锁定数量
     */
    int releaseAllInboundPortLocks(String inboundPort);

    // ========== 出库口锁定相关方法 ==========
    
    /**
     * AGV到达出库口后，锁定出库口
     * @param agvId AGV设备ID
     * @param outboundPort 出库口编号
     * @return 锁定结果：成功返回锁定记录，失败返回null
     */
    TAppAgvLock lockOutboundPort(String agvId, String outboundPort);

    /**
     * 检查出库口是否可以出料（MES系统调用）
     * @param outboundPort 出库口编号
     * @return 是否可以出料
     */
    boolean canFeedToOutboundPort(String outboundPort);
    
    /**
     * 获取当前出库口处理中的任务数量
     * @param outboundPort 出库口编号
     * @return 处理中的任务数量
     */
    int getProcessingOutTaskCount(String outboundPort);
    
    /**
     * 获取出库口状态描述
     * @param outboundPort 出库口编号
     * @return 状态描述（空闲/占用）
     */
    String getOutboundPortStatus(String outboundPort);
    
    /**
     * 释放指定出库口的所有活动锁定
     * @param outboundPort 出库口编号
     * @return 释放的锁定数量
     */
    int releaseAllOutboundPortLocks(String outboundPort);

    // ========== 通用锁定方法 ==========
    
    /**
     * 通用资源锁定方法
     * @param agvId AGV设备ID
     * @param stationCode 站台编号（R1=入库口，C1=出库口）
     * @param taskType 任务类型（1=入库，2=出库）
     * @return 锁定结果：成功返回锁定记录，失败返回null
     */
    TAppAgvLock lockStation(String agvId, String stationCode, Integer taskType);
    
    /**
     * 通用资源解锁方法
     * @param stationCode 站台编号（R1=入库口，C1=出库口）
     * @param taskType 任务类型（1=入库，2=出库）
     * @return 释放的锁定数量
     */
    int releaseStationLocks(String stationCode, Integer taskType);
}