package org.nl.acs.opc;

import org.nl.acs.device.domain.Device;
import org.nl.acs.device.enums.DeviceType;
import org.nl.acs.device_driver.DeviceDriver;
import org.nl.acs.device_driver.LinewayDeviceDriver;

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

/**
 * @author 20220102CG\noblelift
 */
public interface DeviceAppService {
    /**
     * 查找所有设备
     *
     * @return
     */
    List<Device> findAllDevice();

    /**
     * 根据设备编码找设备
     *
     * @param device_code
     * @return
     */
    Device findDeviceByCode(String device_code);

    /**
     * 根据设备地址找设备
     *
     * @param address
     * @return
     */
    Device findDeviceByAddress(String address);

    /**
     * 设备总数
     *
     * @return
     */
    int deviceSize();

    /**
     * key:opcServer编码,List 每个opcServe下面挂了多少Plc
     *
     * @return
     */
    Map<String, List<List<OpcItemDto>>> findAllFormatProtocolFromDriver();

    /**
     * key:opcServer编码,List 每个opcServe下面挂了多少Plc
     * @return
     */
    Map<String, List<List<OpcItemDto>>> findAllFormatProtocolFromDriverByPlc();


    /**
     * 找设备驱动驱动
     *
     * @param clazz
     * @param <T>
     * @return
     */
    <T extends DeviceDriver> List<T> findDeviceDriver(Class<T> clazz);

    /**
     * 根据设备类型查找设备
     *
     * @param deviceType
     * @return
     */
    Map<String, String> findDeviceOptions(DeviceType deviceType);

    /**
     * 根据设备类型查找设备
     *
     * @param deviceType
     * @return
     */
    List findDeviceByType(DeviceType deviceType);

    /**
     * 根据设备类型查找设备
     *
     * @param deviceType
     * @return
     */
    List<Device> findDevice(DeviceType deviceType);

    /**
     * 重新加载设备驱动
     */
    void reload();

    /**
     * 找线网设备
     *
     * @return
     */
    List<LinewayDeviceDriver> findLaneway();

    /**
     * 根据设备编号查询类型
     *
     * @param deviceCode
     * @return
     */
    String findDeviceTypeByCode(String deviceCode);

    /**
     * 移除设备
     *
     * @param deviceCode
     */
    void removeDevice(String deviceCode);

    /**
     * 添加设备
     *
     * @param deviceCode
     */
    void addDevice(String deviceCode);

    /**
     * 查找设备区域
     */
    TreeSet<Integer> selectRegion();
}
