package org.wcs.plugin.plc.communication;

import org.wcs.model.bo.tuple.Tuple2;
import org.wcs.plugin.plc.model.*;

import java.util.List;
import java.util.Map;

/**
 * PLC通讯接口
 */
public interface IPlcCommunication {

    /**
     * 初始化 --- 当操作被绑定到指定PLC时都会调用一次此方法
     */
    void initialize();

    /**
     * 获取指定堆垛机状态
     * @param stackerId 堆垛机ID
     * @return 堆垛机状态 <错误信息，堆垛机状态>
     */
    Tuple2<String, StackerStatus> readStackerStatus(Integer stackerId);

    /**
     * 写入堆垛机任务
     * @param stackerId 堆垛机ID
     * @param task 任务
     * @return 响应结果
     */
    String writeStackerTask(Integer stackerId, StackerTask... task);

    /**
     * 批量获取指定堆垛机任务状态
     * @param stackerId 堆垛机ID
     * @return 堆垛机状态
     */
    Map<Integer, PlcStackerTaskStatus> readStackerTaskStatus(Integer stackerId);

    /**
     * 清空指定堆垛机任务状态
     * @param stackerId 堆垛机ID
     *  @param taskIndex   任务索引
     * @return 响应结果
     */
    String clearStackerTaskStatus(Integer stackerId, Integer taskIndex);

    /**
     * 获取指定输送机任务状态
     * @param conveyId 输送机ID
     * @return 输送机状态
     */
    Tuple2<String, TaskConveyStatus> readTaskConveyStatus(String conveyId);

    /**
     * 批量获取指定输送机任务状态
     * @param conveyId 输送机ID
     * @return 输送机状态
     */
    Tuple2<String, List<TaskConveyStatus>> readTaskMultiConveyStatus(String conveyId);

    /**
     * 写入输送机任务
     * @param conveyId 输送机编号
     * @param task 任务
     * @return 写入结果
     */
    String writeTaskConveyTask(String conveyId, TaskConveyTask task);

    /**
     * 读取扫描器信息
     * @param scannerId 扫描器编号
     * @return 扫描器信息
     */
    Tuple2<String, ScanInfo> readScannerInfo(String scannerId);

    /**
     * 写入扫描器任务
     * @param scannerId 扫描器编号
     * @param task 任务
     * @return 写入结果
     */
    String writeScannerTask(String scannerId, ScanTask task);

    /**
     * 写入指定名称的值 ---- 仅适用于 Siemens PLC DB表里的数据
     * @param name 名称
     * @param value 值
     * @return 写入结果
     */
    String writeWithName(String name, Object value);

    /**
     * 读取指定名称的值  ---- 仅适用于 Siemens PLC DB表里的数据
     * @param name 名称
     * @param clazz 值类型
     * @return 值
     */
    <T> Tuple2<String, T> readWithName(String name, Class<T> clazz);
}
