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


namespace IoT3D.Framework.Unity
{
    public class RPCComponent : MonoBehaviour
    {
        [HideInInspector] public string IpAdress;
        [HideInInspector] public string Token = string.Empty;
        [HideInInspector] public string UserName;
        [HideInInspector] public int Port;

        UnityRpcService rpcService;
        protected void Awake()
        {
            rpcService = GetComponentInChildren<UnityRpcService>(true);
            DontDestroyOnLoad(this);
        }

        public void ReceiveTaken(string token)
        {
            Token = token;
            Debug.LogError($"Token:{token}");
        }
        public void ReceiveIp(string ip)
        {
            IpAdress = ip;
            Debug.LogError($"ipAdress:{ip}");
        }
        private void LateUpdate()
        {
        }
     
        public void Login(string ipAdress, string user, string pwd)
        {
            IpAdress = ipAdress;
            UserName = user;
            rpcService.Login(ipAdress, user, pwd);
            string _logindata = $"{ipAdress};{user}";
            PlayerPrefs.SetString("current_login", _logindata);
        }

        private void Start()
        {
           // deviceComponent = Entry.GetComponent<DeviceComponent>();
        }
        public bool Connected
        {
            get
            {
                if (rpcService == null)
                    return false;
                return rpcService.Connected;
            }
        }

        /// <summary>
        /// 订阅一个连接成功的事件
        /// </summary>
        /// <param name="action"></param>
        public void AddConcentListener(UnityAction<UserTaken> action)
        {
            rpcService?.OnLoginChanged.AddListener(action);

        }
        /// <summary>
        /// 移除连接事件
        /// </summary>
        /// <param name="action"></param>
        public void RemoveConcentListener(UnityAction<UserTaken> action)
        {
            rpcService?.OnLoginChanged.RemoveListener(action);
        }
        /// <summary>
        /// 订阅平台信息推送的事件
        /// </summary>
        /// <param name="del">委托方法</param>
        public void AddReceiveChanged(Action<string> del)
        {
            rpcService?.AddReceiveChanged(del);
        }

        /// <summary>
        /// 获取一个表达式的值
        /// </summary>
        /// <param name="param">表达式</param>
        /// <returns></returns>
        public async Task<string> GetValueData(string param)
        {
            return await rpcService.GetValueExpressionData(param);
        }

        public UserData GetUserData
        {
            get
            {
                return rpcService?.UserData;
            } 
        }
        /// <summary>
        /// 设置一个设备 
        /// </summary>
        /// <param name="s_no">设备号</param>
        /// <param name="n_no">设置号</param>
        public void SetParam(int s_no, int n_no)
        {
            // m_RpcManager.SetParam(s_no,n_no);
            rpcService?.SetParam(s_no, n_no);
        }
        /// <summary>
        /// 设置一个设备
        /// </summary>
        /// <param name="s_no">设备号</param>
        /// <param name="n_no">设置号</param>
        /// <param name="s_value">值</param>
        public void SetParam(int s_no, int n_no, string s_value)
        {
            //m_RpcManager.SetParam(s_no, n_no,s_value);
            rpcService?.SetParam(s_no, n_no, s_value);
        }
        /// <summary>
        /// 获取数据库数据
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="sql">数据库语句</param>
        /// <returns></returns>
        public async Task<T> GetAsyncSQLData<T>(string sql)
        {
            return await rpcService.GetAsyncSQLData<T>(sql);
        }

        public async Task<YcItemData> GetYcpItemAsync(int equipNo, int ycNo)
        {
            return await rpcService?.GetYcpItemAsync(equipNo, ycNo);
        }
        public async Task<YxItemData> GetYxpItemAsync(int equipNo, int yxNo)
        {
            return await rpcService?.GetYxpItemAsync(equipNo, yxNo);
        }

        public async Task<List<YxItemData>> GetYxpListItemAsync(int equipNo)
        {
            return await rpcService?.GetYxpListItemAsync(equipNo);
        }
        public async Task<List<YcItemData>> GetYcpListItemAsync(int equipNo)
        {
            return await rpcService?.GetYcpListItemAsync(equipNo);
        }

        public void SetWuBaoAsync(int equipNo, int ycyxNo, string type)
        {
            rpcService?.SetWuBaoAsync(equipNo,ycyxNo,type);
        }

        public async Task<EquipState> GetEquipStateAsync(int equipNo)
        {
            return await rpcService?.GetEquipState(equipNo);
        }
        public async Task<List<SetParm>> GetSetParmsAsync(int equipNo)
        {
            return await rpcService?.GetSetParmsAsync(equipNo);
        }

        /// <summary>
        /// 获取平台实时快照数据
        /// </summary>
        /// <returns></returns>
        public async Task<List<RealTimeEventItem>> GetRealTimeEventListAsync()
        {
            return await rpcService?.GetRealTimeEventListAsync();
        }

        public void AddEquipStateSubscribe(int eqNo)
        {
             rpcService.AddEquipStateSubscribe(eqNo);
        }
        public void RemoveEquipStateSubscribe(int eqNo)
        {
            rpcService.RemoveEquipStateSubscribe(eqNo);
        }
        /// <summary>
        /// 获取设备状态
        /// </summary>
        /// <param name="eqNo">设备号</param>
        /// <returns></returns>
        public async Task<EquipState> GetEquipState(int eqNo)
        {
            return await rpcService.GetEquipState(eqNo);

        }
        /// <summary>
        /// 获取测点历史数据
        /// </summary>
        /// <param name="dateTimes">时间列表</param>
        /// <param name="eqNo">设备号</param>
        /// <param name="ycNo">遥测/遥信号</param>
        /// <param name="type">测点类型</param>
        /// <returns></returns>
        public async Task<List<myCurveData>> GetDataFromCurveAsync(List<DateTime> dateTimes, int eqNo, int ycyxNo, string type = "C")
        {
            return await rpcService?.GetDataFromCurveAsync(dateTimes, eqNo, ycyxNo, type);
        }
        /// <summary>
        /// 确认快照处理
        /// </summary>
        /// <param name="realTimeEventItem">处理后的快照信息</param>
        /// <returns></returns>
        public async Task ConfirmedRealTimeEventItem(RealTimeEventItem realTimeEventItem)
        {
            await rpcService?.ConfirmedRealTimeEventItem(realTimeEventItem);
        }
        public async Task<Dictionary<int, EquipState>> GetEquipStateDic(List<int> equipNos)
        {
            return await rpcService?.GetEquipStateDic(equipNos);
        }
        private void OnDestroy()
        {
            rpcService?.LoginOut();
        }
    }

}

