using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using TeamAAS_VP.Enums;
using TeamAAS_VP.Models;
using TeamAAS_VP.Models.Calibration;
using TeamAAS_VP.Models.Feeder;
using TeamAAS_VP.Models.Lights;
using TeamAAS_VP.Models.PLC;
using TeamAAS_VP.Models.Scanner;
using TeamAAS_VP.Models.ScrewDriver;
namespace TeamAAS_VP.Interfaces
{
///
/// 配置管理服务:管理系统设置、相机、机器人、Feeder、PLC、后台通讯等配置的增删改查与持久化。
/// 实现类负责在内存与持久化存储(例如文件或数据库)之间同步数据,并提供同步与异步的加载/保存接口。
///
public interface IConfigService : IDisposable
{
// Load/Save
///
/// 同步加载所有配置(从持久化存储读取并更新内存中的配置)。
///
///
/// 该方法为阻塞调用,适用于应用启动时或明确需要同步加载的场景。
/// 实现应保证在发生错误时记录日志并在必要时抛出异常以通知调用方。
///
void LoadAll();
///
/// 异步加载所有配置(从持久化存储读取并更新内存中的配置)。
///
/// 一个表示异步加载操作的任务。
Task LoadAllAsync();
///
/// 同步保存所有当前内存中的配置到持久化存储。
///
///
/// 该方法为阻塞调用,适用于需要立即保证配置持久化的场景。
///
void SaveAll();
///
/// 异步保存所有当前内存中的配置到持久化存储。
///
/// 表示保存操作完成的任务。
Task SaveAllAsync();
// Cameras
///
/// 获取所有已注册的相机信息的只读集合。
///
/// 相机信息的只读集合快照。
IReadOnlyCollection GetAllCameras();
///
/// 根据标识获取单个相机信息。
///
/// 相机的唯一标识符。
/// 对应的 实例;若未找到则返回 null。
CameraInfo GetCamera(Guid id);
///
/// 新增或更新指定的相机信息。
///
/// 要新增或更新的相机信息,不能为 null。
/// 当 为 null 时抛出。
CameraInfo AddOrUpdateCamera(CameraInfo camera);
///
/// 移除指定标识的相机信息。
///
/// 要移除的相机的唯一标识符。
/// 如果找到并移除成功则返回 true;否则返回 false。
bool RemoveCamera(Guid id);
///
/// 判断是否包含指定标识的相机配置。
///
/// 相机唯一标识符。
/// 存在则返回 true,否则返回 false。
bool ContainsCamera(Guid id);
// Robots
///
/// 获取所有已注册的机器人信息的只读集合。
///
/// 机器人信息的只读集合快照。
IReadOnlyCollection GetAllRobots();
///
/// 获取所有已注册的扫码枪信息的只读集合。
///
/// 扫码枪信息的只读集合快照。
IReadOnlyCollection GetAllScanners();
///
/// 根据标识获取单个机器人信息。
///
/// 机器人的唯一标识符。
/// 对应的 实例;若未找到则返回 null。
RobotInfo GetRobot(Guid id);
///
/// 根据标识获取单个扫码枪信息。
///
/// 扫码枪的唯一标识符。
/// 对应的 实例;若未找到则返回 null。
ScannerInfo GetScanner(Guid id);
///
/// 新增或更新指定的机器人信息。
///
/// 要新增或更新的机器人信息,不能为 null。
/// 当 为 null 时抛出。
RobotInfo AddOrUpdateRobot(RobotInfo robot);
///
/// 新增或更新指定的扫码枪信息。
///
/// 要新增或更新的扫码枪信息,不能为 null。
/// 当 为 null 时抛出。
ScannerInfo AddOrUpdateScanner(ScannerInfo scanner);
///
/// 移除指定标识的机器人信息。
///
/// 要移除的机器人的唯一标识符。
/// 如果找到并移除成功则返回 true;否则返回 false。
bool RemoveRobot(Guid id);
///
/// 移除指定标识的扫码枪信息。
///
/// 要移除的扫码枪的唯一标识符。
/// 如果找到并移除成功则返回 true;否则返回 false。
bool RemoveScanner(Guid id);
///
/// 判断是否包含指定标识的机器人配置。
///
/// 机器人唯一标识符。
/// 存在则返回 true,否则返回 false。
bool ContainsRobot(Guid id);
///
/// 修改指定机器人id的步进距离
///
/// 机器人唯一标识符。
/// 步进距离
///
bool UpdateRobotStepDistance(Guid id, double stepDistance);
///
/// 获取指定机器人Id的步进距离
///
///
///
double GetRobotStepDistance(Guid id);
// Feeders
///
/// 获取所有已注册的 Feeder 信息的只读集合。
///
/// Feeder 信息的只读集合快照。
IReadOnlyCollection GetAllFeeders();
///
/// 根据标识获取单个 Feeder 信息。
///
/// Feeder 的唯一标识符。
/// 对应的 实例;若未找到则返回 null。
FeederInfo GetFeeder(Guid id);
///
/// 新增或更新指定的 Feeder 信息。
///
/// 要新增或更新的 Feeder 信息,不能为 null。
/// 当 为 null 时抛出。
FeederInfo AddOrUpdateFeeder(FeederInfo feeder);
///
/// 移除指定标识的 Feeder 信息。
///
/// 要移除的 Feeder 的唯一标识符。
/// 如果找到并移除成功则返回 true;否则返回 false。
bool RemoveFeeder(Guid id);
///
/// 判断是否包含指定标识的 Feeder 配置。
///
/// Feeder 唯一标识符。
/// 存在则返回 true,否则返回 false。
bool ContainsFeeder(Guid id);
// PLCs
///
/// 获取所有已注册的 PLC 信息的只读集合。
///
/// PLC 信息的只读集合快照。
IReadOnlyCollection GetAllPlcs();
///
/// 根据标识获取单个 PLC 信息。
///
/// PLC 的唯一标识符。
/// 对应的 实例;若未找到则返回 null。
PlcInfo GetPlc(Guid id);
///
/// 新增或更新指定的 PLC 信息。
///
/// 要新增或更新的 PLC 信息,不能为 null。
/// 当 为 null 时抛出。
PlcInfo AddOrUpdatePlc(PlcInfo plc);
///
/// 移除指定标识的 PLC 信息。
///
/// 要移除的 PLC 的唯一标识符。
/// 如果找到并移除成功则返回 true;否则返回 false。
bool RemovePlc(Guid id);
///
/// 判断是否包含指定标识的 PLC 配置。
///
/// PLC 唯一标识符。
/// 存在则返回 true,否则返回 false。
bool ContainsPlc(Guid id);
// Plc Addresses
///
/// Get all PlcAddress entries
///
///
PlcAddressConfig GetPlcAddresses();
// Background TCP
///
/// 获取后台通讯(TCP/IP)配置。
///
/// 当前后台 TCP 配置快照。
BgTcpIP GetBgTcp();
///
/// 设置后台通讯(TCP/IP)配置(仅更新内存)。
///
/// 新的后台 TCP 配置,不能为 null。
/// 当 为 null 时抛出。
void SetBgTcp(BgTcpIP cfg);
///
/// 将当前内存中的后台 TCP 配置保存到持久化存储。
///
void SaveBgTcp();
// Background Modbus
///
/// 获取后台 Modbus TCP 配置。
///
/// 当前后台 Modbus TCP 配置快照。
BgModbusTcp GetBgModbusTcp();
///
/// 设置后台 Modbus TCP 配置(仅更新内存)。
///
/// 新的后台 Modbus TCP 配置,不能为 null。
/// 当 为 null 时抛出。
void SetBgModbusTcp(BgModbusTcp cfg);
///
/// 将当前内存中的后台 Modbus TCP 配置保存到持久化存储。
///
void SaveBgModbusTcp();
//系统设置
///
/// 获取系统设置
///
///
SystemConfiguration GetSystemConfiguration();
///
/// 保存系统设置
///
void SaveSystemConfiguration(SystemConfiguration systemConfiguration);
//清料任务
///
/// 获取所有清料任务
///
///
IReadOnlyCollection GetAllClearanceTasks();
///
/// 新增或更新清料任务
///
///
///
FeederClearWork AddOrUpdateClearanceTask(FeederClearWork task);
///
/// 移除清料任务
///
///
///
bool RemoveClearanceTask(Guid id);
///
/// 清除所有清料任务
///
void ClearAllClearanceTasks();
///
/// 判断是否包含指定标识的清料任务
///
///
///
bool ContainsClearanceTask(Guid id);
///
/// 根据标识获取单个清料任务信息
///
///
///
FeederClearWork GetClearanceTask(Guid id);
///
/// 判断是否包含指定编号的清料任务
///
///
///
bool ContainsClearanceTaskByNumber(int taskNumber);
///
/// 根据编号获取单个清料任务信息
///
///
///
FeederClearWork GetClearanceTaskByNumber(int taskNumber);
// Light controllers and channels
///
/// 获取所有已注册的灯光控制器信息的只读集合。
///
/// 灯光控制器信息的只读集合快照。
IReadOnlyCollection GetAllLightControllers();
///
/// 根据标识获取单个灯光控制器信息。
///
/// 灯光控制器的唯一标识符。
/// 对应的 实例;若未找到则返回 null。
LightControllerConfig GetLightController(int id);
///
/// 新增或更新指定的灯光控制器信息。
///
/// 要新增或更新的灯光控制器信息,不能为 null。
/// 当 为 null 时抛出。
LightControllerConfig AddOrUpdateLightController(LightControllerConfig controller);
///
/// 移除指定标识的灯光控制器信息。
///
/// 要移除的灯光控制器的唯一标识符。
/// 如果找到并移除成功则返回 true;否则返回 false。
bool RemoveLightController(int id);
///
/// 判断是否包含指定标识的灯光控制器配置。
///
/// 灯光控制器唯一标识符。
/// 存在则返回 true,否则返回 false。
bool ContainsLightController(int id);
///
/// 获取所有已注册的灯光通道信息的只读集合。
///
/// 灯光通道信息的只读集合快照。
IReadOnlyCollection GetAllLightChannels();
///
/// 根据全局索引获取单个灯光通道信息。
///
/// 灯光通道的全局索引。
/// 对应的 实例;若未找到则返回 null。
ChannelConfig GetLightChannelByGlobalIndex(int globalIndex);
///
/// 判断是否包含指定全局索引的灯光通道配置。
///
/// 灯光通道的全局索引。
/// 存在则返回 true,否则返回 false。
bool ContainsLightChannelByGlobalIndex(int globalIndex);
///
/// 更新指定灯光通道的默认亮度值并保存到持久化存储。
///
/// 灯光通道的全局索引。
/// 新的默认亮度值,范围应在合适的区间内。
/// 如果找到并更新成功则返回 true;否则返回 false。
bool UpdateChannelDefaultBrightness(int globalIndex, int brightness);
// Screw driver (single device) configuration accessors
///
/// 获取电批配置(单设备)。
///
/// 当前的 ,若未加载则返回 null。
ScrewDriverConfig GetScrewDriverConfig();
///
/// 设置并持久化电批配置(单设备)。
///
/// 新的配置对象,不能为空。
void SetScrewDriverConfig(ScrewDriverConfig cfg);
///
/// 仅将当前内存中的电批配置保存到文件。
///
void SaveScrewDriverConfig();
// Screw feeder (material) management
///
/// 获取所有已注册的螺丝供料器信息的只读集合。
///
IReadOnlyCollection GetAllScrewFeeders();
///
/// 根据标识获取单个螺丝供料器信息。
///
ScrewFeederInfo GetScrewFeeder(Guid id);
///
/// 新增或更新指定的螺丝供料器信息。
///
ScrewFeederInfo AddOrUpdateScrewFeeder(ScrewFeederInfo feeder);
///
/// 移除指定标识的螺丝供料器信息。
///
bool RemoveScrewFeeder(Guid id);
///
/// 判断是否包含指定标识的螺丝供料器配置。
///
bool ContainsScrewFeeder(Guid id);
///
/// 为指定供料器编号递减指定数量(通常为 1),若数量不足返回 false
///
bool DecrementScrewCountByFeederNumber(int feederNumber, int decrement = 1);
///
/// 清除指定供料器编号的螺丝信息(批次号与剩余数量置空/置0)
///
void ClearScrewFeederByNumber(int feederNumber);
///
/// 为指定供料器编号设置螺丝批次号,并在原有剩余数量上增加一包的数量(PackSize)
///
void SetBatchForFeederNumber(int feederNumber, string batchNumber);
///
/// 获取指定供料器编号的剩余螺丝数量(找不到返回 -1)
///
int GetRemainingCountByFeederNumber(int feederNumber);
///
/// 获取指定供料器编号的低量报警状态(找不到返回 false)
///
bool GetLowLevelAlarmStatusByFeederNumber(int feederNumber);
///
/// 当某个螺丝供料器触发低量报警时会触发此事件,订阅者可用于上报或 UI 提示。
///
event Action ScrewFeederLowLevelAlarmTriggered;
///
/// 记录一次螺丝供料器批次更换记录(写入数据库)。
///
Task RecordScrewFeederBatchAsync(ScrewFeederBatchRecord record);
//刷卡登录
///
/// 获取刷卡器配置
///
///
SerialPortConfig GetCardReaderConfig();
///
/// 保存刷卡器配置
///
///
void SaveCardReaderConfig(SerialPortConfig config);
///
/// 获取当前语言
///
///
Language GetCurrentLanguage();
///
/// 设置当前语言
///
///
void SetCurrentLanguage(Language language);
// Device info
///
/// 获取或创建设备信息配置
///
DeviceInfo GetDeviceInfo();
///
/// 保存设备信息配置
///
void SaveDeviceInfo(DeviceInfo deviceInfo);
///
/// 添加新设备
///
/// 新添加的设备
DeviceInfo AddDeviceInfo();
///
/// 删除设备
///
/// 设备编号
/// 是否删除成功
bool RemoveDeviceInfo(int deviceNo);
///
/// 保存所有设备信息列表
///
/// 设备信息列表
void SaveAllDeviceInfos(IEnumerable deviceInfoList);
// Device info - 支持多设备
///
/// 获取所有设备信息配置列表
///
/// 设备信息列表的只读集合
IReadOnlyCollection GetAllDeviceInfos();
///
/// 根据设备编号获取设备信息
///
/// 设备编号
DeviceInfo GetDeviceInfo(int deviceNo);
}
}