using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using TeamAAS_VP.Models;
namespace TeamAAS_VP.Interfaces
{
///
/// 产品管理服务:用于创建、存储、复制、移除、修改、加载与获取产品,以及管理当前产品状态。
/// 实现应负责线程安全地管理内存中的产品集合,并提供同步与异步两种操作方式以便 UI 与后台任务使用。
///
public interface IProductService : IDisposable
{
///
/// 当前产品编号
///
string CurrentProductCode { get; set; }
///
/// 产品切换事件
///
event Action OnProductChanged;
///
/// 使用指定的本地产品清单文件初始化服务(同步)。
/// 实现应负责从清单文件读取产品信息并将其加载到服务的内部集合中。
/// 返回 true 表示初始化并加载成功;false 表示失败(或按实现约定抛出异常)。
///
/// 初始化是否成功。
bool Initialize();
///
/// 使用指定的本地产品清单文件初始化服务(异步)。
/// 实现应负责从清单文件读取产品信息并将其加载到服务的内部集合中。
/// 返回 true 表示初始化并加载成功;false 表示失败(或按实现约定抛出异常)。
///
/// 初始化是否成功的任务。
Task InitializeAsync();
///
/// 获取所有产品的简要信息列表(同步)。
///
///
IEnumerable<(Guid id, string name, string filePath)> GetAllProductList();
///
/// 异步创建产品并将其添加到服务管理的集合中。
///
/// 要创建并添加的产品模型。
/// 如果创建并添加成功则返回 true;否则返回 false。
Task CreateProductAsync(ProductModel product);
///
/// 同步创建产品并将其添加到服务管理的集合中。
///
/// 要创建并添加的产品模型。
/// 如果创建并添加成功则返回 true;否则返回 false。
bool CreateProduct(ProductModel product);
///
/// 根据指定 ID 获取产品(同步)。
///
/// 产品的唯一标识符。
/// 如果存在则返回对应的 ;不存在时返回 null(或实现自定义的空表示)。
ProductModel GetProduct(Guid id);
///
/// 根据指定 ID 异步获取产品。
///
/// 产品的唯一标识符。
/// 返回可能为 null 的 ,表示未找到时为 null。
Task GetProductAsync(Guid id);
///
/// 获取所有已加载的产品(只读集合,同步)。
///
/// 返回包含当前所有产品的只读集合。
IReadOnlyCollection GetAllProducts();
///
/// 异步获取所有已加载的产品(只读集合)。
///
/// 返回包含当前所有产品的只读集合。
Task> GetAllProductsAsync();
///
/// 尝试根据指定 ID 获取产品(同步),不会抛出异常用于查找失败的情况。
///
/// 要查找的产品 ID。
/// 当返回 true 时为找到的产品;否则应设置为 null 或默认值。
/// 如果找到产品则返回 true;否则返回 false。
bool TryGetProduct(Guid id, out ProductModel product);
///
/// 异步尝试根据指定 ID 获取产品。返回一个元组,包含查找是否成功以及对应的产品(若未找到则为 null)。
///
/// 要查找的产品 ID。
/// 返回元组:(found: 是否找到, product: 找到的产品或 null)。
Task<(bool found, ProductModel product)> TryGetProductAsync(Guid id);
///
/// 判断服务中是否包含指定 ID 的产品(同步)。
///
/// 产品的唯一标识符。
/// 若包含则返回 true;否则返回 false。
bool ContainsProduct(Guid id);
///
/// 异步判断服务中是否包含指定 ID 的产品。
///
/// 产品的唯一标识符。
/// 若包含则返回 true;否则返回 false。
Task ContainsProductAsync(Guid id);
///
/// 判断服务中是否包含指定名称的产品(同步)。
///
/// 产品的名称
/// 若包含则返回 true;否则返回 false。
bool ContainsProductByName(string name);
///
/// 判断服务中是否包含指定名称的产品(异步)。
///
/// 产品的名称
/// 若包含则返回 true;否则返回 false。
Task ContainsProductByNameAsync(string name);
///
/// 从服务中移除指定 ID 的产品(同步)。
///
/// 要移除的产品 ID。
/// 如果移除成功(存在并被移除)返回 true,否则返回 false。
bool RemoveProduct(Guid id);
///
/// 异步从服务中移除指定 ID 的产品。
///
/// 要移除的产品 ID。
/// 如果移除成功(存在并被移除)返回 true,否则返回 false。
Task RemoveProductAsync(Guid id);
///
/// 从服务中移除所有产品(同步),清空内部集合并释放相关资源(若有)。
///
void RemoveAllProducts();
///
/// 将指定产品保存到给定文件路径(同步)。
/// 若产品不存在,应抛出相应异常或以返回值/日志方式处理(实现约定)。
///
/// 要保存的产品 ID。
/// 目标文件的完整路径。
void SaveProduct(Guid id, string filePath);
///
/// 异步将指定产品保存到给定文件路径。
///
/// 要保存的产品 ID。
/// 目标文件的完整路径。
Task SaveProductAsync(Guid id, string filePath);
///
/// 保存产品
///
///
void SaveProduct(Guid id);
///
/// 保存产品
///
///
///
Task SaveProductAsync(Guid id);
///
/// 保存产品清单
///
void SaveProductList();
///
/// 异步保存产品清单
///
///
Task SaveProductListAsync();
///
/// 从指定文件加载产品(同步)。实现应负责反序列化并将产品添加到服务管理的集合(或仅返回实例,取决于实现约定)。
///
/// 要加载的产品唯一标识符。
/// 加载并返回的 实例。
ProductModel LoadProduct(Guid id);
///
/// 异步从指定文件加载产品并返回加载的模型。
///
/// 要加载的产品唯一标识符。
/// 加载并返回的 实例。
Task LoadProductAsync(Guid id);
///
/// 根据产品加载记录,获取最近一次加载的产品信息(同步)。
///
/// 返回一个元组:(id, name),分别表示最后加载的产品 ID 与名称;若无记录,ID 可为 .Empty,名称可为空字符串。
(Guid id, string name) LoadLastProduct();
///
/// 异步根据产品加载记录,获取最近一次加载的产品信息。
///
/// 返回一个元组:(id, name),分别表示最后加载的产品 ID 与名称;若无记录,ID 可为 .Empty,名称可为空字符串。
Task<(Guid id, string name)> LoadLastProductAsync();
///
/// 设置为当前选中的或正在编辑的产品(同步)。
///
///
void SetCurrentProduct(Guid id);
///
/// 获取当前选中的或正在编辑的产品实例(同步)。
///
/// 当前产品的 实例;若无当前产品可返回 null。
ProductModel GetCurrentProduct();
///
/// 复制指定产品为一个新对象并返回新对象的 ID(同步)。
/// 实现应复制所有必要的数据并为新产品生成新的唯一 ID,同时支持为新产品指定名称。
///
/// 要复制的源产品 ID。
/// 新复制产品的名称。
/// 新复制产品的 ID。
Guid CopyProduct(Guid id, string newName);
///
/// 异步复制指定产品为一个新对象并返回新对象的 ID。
///
/// 要复制的源产品 ID。
/// 新复制产品的名称。
/// 新复制产品的 ID。
Task CopyProductAsync(Guid id, string newName);
///
/// 永久删除产品
///
///
void DeleteProduct(Guid id);
///
/// 永久删除产品
///
///
Task DeleteProductAsync(Guid id);
///
/// 对指定产品进行重命名
///
///
///
void RenameProduct(Guid id, string newName);
///
/// 对指定产品进行重命名
///
///
///
///
Task RenameProductAsync(Guid id, string newName);
///
/// 更新产品
///
///
void UpdateProduct(ProductModel product);
///
/// 更新产品
///
///
///
Task UpdateProductAsync(ProductModel product);
///
/// 根据指定的模板名称创建产品
///
///
///
///
ProductModel CreateProductByTemplateName(string templateName,string productName);
///
/// 根据指定的模板名称异步创建产品
///
///
///
///
Task CreateProductByTemplateNameAsync(string templateName, string productName);
///
/// 增加相机时,需要对产品的相机流程进行增加
///
///
///
void AddCameraToProduct(Guid cameraId, string cameraName);
///
/// 增加相机时,需要对产品的相机流程进行增加
///
///
///
///
Task AddCameraToProductAsync(Guid cameraId, string cameraName);
///
/// 删除相机时,需要对产品的相机流程进行删除
///
///
void RemoveCameraFromProduct(Guid cameraId);
///
/// 删除相机时,需要对产品的相机流程进行删除
///
///
///
Task RemoveCameraFromProductAsync(Guid cameraId);
///
/// 修改相机名称时,需要对产品的相机流程进行修改
///
///
///
void UpdateCameraNameInProduct(Guid cameraId, string newCameraName);
///
/// 修改相机名称时,需要对产品的相机流程进行修改
///
///
///
///
Task UpdateCameraNameInProductAsync(Guid cameraId, string newCameraName);
///
/// 增加机器人时,需要对产品的机器人点位进行增加
///
///
///
void AddRobotPointToProduct(Guid robotId, string robotPointName);
///
/// 增加机器人时,需要对产品的机器人点位进行增加
///
///
///
///
Task AddRobotPointToProductAsync(Guid robotId, string robotPointName);
///
/// 删除机器人时,需要对产品的机器人点位进行删除
///
///
void RemoveRobotPointFromProduct(Guid robotId);
///
/// 删除机器人时,需要对产品的机器人点位进行删除
///
///
///
Task RemoveRobotPointFromProductAsync(Guid robotId);
///
/// 修改机器人名称时,需要对产品的机器人点位进行修改
///
///
///
void UpdateRobotPointNameInProduct(Guid robotId, string newRobotPointName);
///
/// 修改机器人名称时,需要对产品的机器人点位进行修改
///
///
///
///
Task UpdateRobotPointNameInProductAsync(Guid robotId, string newRobotPointName);
///
/// 加载指定产品流程的视觉工具
///
///
///
///
void LoadProcedureVisionTools(Guid productid, Guid cameraid, string prcname);
///
/// 加载指定产品流程的视觉工具
///
///
///
///
///
Task LoadProcedureVisionToolsAsync(Guid productid, Guid cameraid, string prcname);
///
/// 获取当前产品的指定视觉流程ID的视觉流程对象
///
///
///
ProcedureModel GetCurrentProductProcedureModelById(Guid procedureId);
}
}