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

public abstract class RpcBase : MonoBehaviour,IRpcHelper
{
    private LoginEvent loginChanged = new LoginEvent();
    /// <summary>
    /// 登录事件
    /// </summary>
    public LoginEvent OnLoginChanged { get => loginChanged; }

    private UserData userData = new UserData();
    /// <summary>
    /// 用户信息
    /// </summary>
    public UserData UserData { get { return userData; } }

    /// <summary>
    /// IoTCenter是否连接成功
    /// </summary>
    public abstract bool Connected { get; }
    /// <summary>
    /// IoTCenter平台登录
    /// </summary>
    /// <param name="ipAdress">服务器地址</param>
    /// <param name="user">用户名</param>
    /// <param name="pwd">密码</param>
    public abstract void Login(string ipAdress, string user, string pwd);
    /// <summary>
    /// IoTCenter平台登出
    /// </summary>
    public abstract void LoginOut();
    /// <summary>
    /// 订阅IoTCenter平台信息推送的事件 例如：语音、自定义的内容推送
    /// </summary>
    /// <param name="del"></param>
    public abstract void AddReceiveChanged(Action<string> del);

    /// <summary>
    /// 订阅IoTCenter平台设备状态
    /// </summary>
    /// <param name="equipNo">设备号</param>
    public abstract void AddEquipStateSubscribe(int equipNo);
    /// <summary>
    /// 移除订阅IoTCenter平台设备状态
    /// </summary>
    /// <param name="equipNo">设备号</param>
    public abstract void RemoveEquipStateSubscribe(int equipNo);
    /// <summary>
    /// 获取IoT设备的控制信息
    /// </summary>
    /// <param name="equipNo">设备号</param>
    /// <returns></returns>
    public abstract Task<List<SetParm>> GetSetParmsAsync(int equipNo);
    /// <summary>
    /// 获取设备遥测点位信息
    /// </summary>
    /// <param name="equipNo">设备号</param>
    /// <param name="ycNo">遥测号</param>
    /// <returns></returns>
    public abstract Task<YcItemData> GetYcpItemAsync(int equipNo,int ycNo);
    /// <summary>
    /// 获取设备遥信点位信息
    /// </summary>
    /// <param name="equipNo">设备号</param>
    /// <param name="yxNo">遥信号</param>
    /// <returns></returns>
    public abstract Task<YxItemData> GetYxpItemAsync(int equipNo,int yxNo);
    /// <summary>
    /// 设置设备误报禁
    /// </summary>
    /// <param name="equipNo">设备号</param>
    /// <param name="ycyxNo">遥测/遥信号</param>
    /// <param name="type"></param>
    public abstract void SetWuBaoAsync(int equipNo, int ycyxNo, string type);
    /// <summary>
    /// 处理实时快照事件
    /// </summary>
    /// <param name="realTimeEventItem">实时快照</param>
    /// <returns></returns>
    public abstract Task ConfirmedRealTimeEventItem(RealTimeEventItem realTimeEventItem);
    /// <summary>
    /// 获取IoTCenter 所有实时快照数据
    /// </summary>
    /// <returns></returns>
    public abstract Task<List<RealTimeEventItem>> GetRealTimeEventListAsync();
    public abstract 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>
    public abstract 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>
    public abstract Task<List<myCurveData>> GetChangedDataFromCurveAsync(DateTime bgn, DateTime end, int eqNo, int ycNo, string type = "C");

    /// <summary>
    ///  执行一个设置点
    /// </summary>
    /// <param name="s_no">设备号</param>
    /// <param name="n_no">设置后</param>
    public abstract 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>
    public abstract void SetParam(int s_no, int n_no, string s_value);
    /// <summary>
    /// 获取遥测值
    /// </summary>
    /// <param name="equipNo">设备号</param>
    /// <param name="ycNo">遥测号</param>
    /// <returns></returns>
    public abstract Task<string> GetYcValueData(int equipNo, int ycNo);
    /// <summary>
    /// 获取遥信值
    /// </summary>
    /// <param name="equipNo">设备号</param>
    /// <param name="ycNo">遥测号</param>
    /// <returns></returns>
    public abstract Task<string> GetYxValueData(int equipNo, int ycNo);

    /// <summary>
    /// 通过设备号获取设备告警记录
    /// </summary>
    /// <param name="equipNos">设备号列表</param>
    /// <param name="startTime">开始时间</param>
    /// <param name="endTime">结束时间</param>
    /// <param name="pageSize">数量</param>
    /// <param name="pageIndex">页码</param>
    /// <param name="eventType">事件类型</param>
    /// <returns></returns>
    public abstract Task<IoTEquipEventData> GetEquipEvent(List<int> equipNos, DateTime startTime, DateTime endTime, int pageSize = 20, int pageIndex = 1, IoTEquipEventType eventType = IoTEquipEventType.Equip_Event);
    /// <summary>
    /// 获取表达式值
    /// </summary>
    /// <param name="param"></param>
    /// <returns></returns>
    public abstract Task<string> GetValueExpressionData(string param);
    /// <summary>
    /// 获取设备状态
    /// </summary>
    /// <param name="eqNo">设备号</param>
    /// <returns></returns>
    public abstract Task<EquipState> GetEquipState(int eqNo);
}
