﻿using IoT3D.Framework;
using IoT3D.Framework.DataModel;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine.Events;

public interface IRpcHelper
{


    public LoginEvent OnLoginChanged { get; }
    UserData UserData { get; }
    /// <summary>
    /// 连接状态
    /// </summary>
    bool Connected { get; }

    /// <summary>
    /// 订阅IoTCenter平台接受到的消息
    /// </summary>
    /// <param name="del"></param>
    void AddReceiveChanged(Action<string> del);

    /// <summary>
    /// 订阅IoTCenter设备状态变化
    /// </summary>
    /// <param name="equipNo">设备号</param>
    void AddEquipStateSubscribe(int equipNo);
    /// <summary>
    /// 取消订阅IoTCenter设备
    /// </summary>
    /// <param name="equipNo">设备号</param>
    void RemoveEquipStateSubscribe(int equipNo);
    /// <summary>
    /// 获取设备控制项
    /// </summary>
    /// <param name="equipNo"></param>
    /// <returns></returns>
    Task<List<SetParm>> GetSetParmsAsync(int equipNo);
    /// <summary>
    /// 获取表达式值
    /// </summary>
    /// <param name="param"></param>
    /// <returns></returns>
    Task<string> GetValueExpressionData(string param);
    /// <summary>
    /// 获取一个遥测值
    /// </summary>
    /// <param name="equipNo">设备号</param>
    /// <param name="ycNo">遥测号</param>
    /// <returns></returns>
    Task<string> GetYcValueData(int equipNo,int ycNo);
    /// <summary>
    /// 获取一个遥信值
    /// </summary>
    /// <param name="equipNo">设备号</param>
    /// <param name="ycNo">遥测号</param>
    /// <returns></returns>
    Task<string> GetYxValueData(int equipNo, int ycNo);
    /// <summary>
    /// 设置设备命令
    /// </summary>
    /// <param name="s_no">设备号</param>
    /// <param name="n_no">设置号</param>
    void SetParam(int s_no, int n_no);
    /// <summary>
    /// 设置设备命令
    /// </summary>
    /// <param name="s_no">设备号</param>
    /// <param name="n_no">设置号</param>
    /// <param name="s_value">设置值</param>
    void SetParam(int s_no, int n_no, string s_value);
    /// <summary>
    /// 设置设备误报
    /// </summary>
    /// <param name="equipNo">设备号</param>
    /// <param name="ycyxNo">遥测/遥信号</param>
    /// <param name="type">测点类型（"X"或"C"）</param>
    void SetWuBaoAsync(int equipNo, int ycyxNo, string type);
    /// <summary>
    /// 获取数据表数据
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="sql">语句</param>
    /// <returns></returns>
    Task<T> GetAsyncSQLData<T>(string sql);
    /// <summary>
    /// 获取测点历史数据
    /// </summary>
    /// <param name="dateTimes">时间数组</param>
    /// <param name="eqNo">设备号</param>
    /// <param name="ycNo">遥测号</param>
    /// <param name="type">测点类型</param>
    /// <returns></returns>
    Task<List<myCurveData>> GetDataFromCurveAsync(List<DateTime> dateTimes, int eqNo, int ycNo, string type = "C");
    /// <summary>
    /// 获取已更改的测点历史数据
    /// </summary>
    /// <param name="bgn">开始时间</param>
    /// <param name="end">结束时间</param>
    /// <param name="eqNo">设备号</param>
    /// <param name="ycNo">遥测号</param>
    /// <param name="type">测点类型</param>
    /// <returns></returns>
    Task<List<myCurveData>> GetChangedDataFromCurveAsync(DateTime bgn, DateTime end, int eqNo, int ycNo, string type = "C");
    /// <summary>
    /// 获取IoTCenter实时快照信息
    /// </summary>
    /// <returns></returns>
    Task<List<RealTimeEventItem>> GetRealTimeEventListAsync();
    /// <summary>
    /// 获取设备状态
    /// </summary>
    /// <param name="eqNo">设备号</param>
    /// <returns></returns>
    Task<EquipState> GetEquipState(int eqNo);
    /// <summary>
    /// 处理一条实时快照信息
    /// </summary>
    /// <param name="realTimeEventItem"></param>
    /// <returns></returns>
    Task ConfirmedRealTimeEventItem(RealTimeEventItem realTimeEventItem);
    /// <summary>
    /// 获取设备事件
    /// </summary>
    /// <param name="equipNos">设备号列表</param>
    /// <param name="startTime">开始时间</param>
    /// <param name="endTime">结束时间</param>
    /// <param name="eventType">事件类型</param>
    /// <param name="pageSize">每页数据</param>
    /// <param name="pageIndex">页码</param>
    /// <returns></returns>
    Task<IoTEquipEventData> GetEquipEvent(List<int> equipNos,DateTime startTime,DateTime endTime, int pageSize = 20, int pageIndex = 1, IoTEquipEventType eventType = IoTEquipEventType.Equip_Event);
}
