using FLY.Thick.Normal.IService;
using FLY.Thick.Normal.IService.IBulkDBServicePack;
using FLY.Thick.Normal.OBJ_INTERFACE;
using FObjBase;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace FLY.Thick.Normal.Client
{
    public class BulkDBServiceClient : FObj, IBulkDBService
    {
        IFConn mConn;
        UInt32 mServerID;
        public bool IsConnected { get; private set; }
        #region IBulkDBService
        /// <summary>
        /// 总数量,当它变化了,肯定有新数据
        /// </summary>
        public int Count { get; private set; } = 0;

        public int Mix { get; set; } = 6;

        public DateTime StartTime { get; private set; }

        public DateTime EndTime { get; private set; }

        public bool IsFinished { get; private set; }

        public event PropertyChangedEventHandler PropertyChanged;

        public event BulkDBTempFrameChangedEventHander TempFrameChanged;
        #endregion


        public BulkDBServiceClient() : this(FLY.Thick.Normal.OBJ_INTERFACE.OBJ_INTERFACE_ID.BULKDB_ID)
        {

        }
        public BulkDBServiceClient(UInt32 id)
        {
            mServerID = id;
        }


        #region IBulkDBService
        public void GetFrame(Pack_GetFrameRequest request, AsyncCBHandler AsyncDelegate, object AsyncContext)
        {
            string json = JsonConvert.SerializeObject(request);

            CurrObjSys.CallFunctionEx(mConn, mServerID, ID,
                BULKDB_OBJ_INTERFACE.CALL_GET_FRAME,
                Misc.Converter.StringToBytes(json),
                AsyncDelegate, AsyncContext);
        }

        public void GetHistogram(Pack_GetHistogramRequest request, AsyncCBHandler AsyncDelegate, object AsyncContext)
        {
            string json = JsonConvert.SerializeObject(request);

            CurrObjSys.CallFunctionEx(mConn, mServerID, ID,
                BULKDB_OBJ_INTERFACE.CALL_GET_HISTOGRAM,
                Misc.Converter.StringToBytes(json),
                AsyncDelegate, AsyncContext);
        }

        public void GetSample(Pack_GetSampleRequest request, AsyncCBHandler AsyncDelegate, object AsyncContext)
        {
            string json = JsonConvert.SerializeObject(request);

            CurrObjSys.CallFunctionEx(mConn, mServerID, ID,
                BULKDB_OBJ_INTERFACE.CALL_GET_SAMPLE,
                Misc.Converter.StringToBytes(json),
                AsyncDelegate, AsyncContext);
        }

        public void GetTrend(Pack_GetTrendRequest request, AsyncCBHandler AsyncDelegate, object AsyncContext)
        {
            string json = JsonConvert.SerializeObject(request);

            CurrObjSys.CallFunctionEx(mConn, mServerID, ID,
                BULKDB_OBJ_INTERFACE.CALL_GET_TREND,
                Misc.Converter.StringToBytes(json),
                AsyncDelegate, AsyncContext);
        }

        public void Apply()
        {
            BULKDB_OBJ_INTERFACE.Pack_Params p = new BULKDB_OBJ_INTERFACE.Pack_Params();
            p.Mix = Mix;
            
            string json = JsonConvert.SerializeObject(p);

            CurrObjSys.SetValueEx(mConn, mServerID, ID,
                BULKDB_OBJ_INTERFACE.SET_PARAMS,
                Misc.Converter.StringToBytes(json));
        }
        public void Finish()
        {
            CurrObjSys.CallFunctionEx(mConn, mServerID, ID,
                BULKDB_OBJ_INTERFACE.CALL_FINISH,
                null);
        }
        #endregion

        #region FObj
        public override void ConnectNotify(IFConn from)
        {
            mConn = from;
            IsConnected = from.IsConnected;
            if (from.IsConnected)
            {
                //获取所有数据,设置推送
                CurrObjSys.GetValueEx(
                    mConn, mServerID, ID,
                    BULKDB_OBJ_INTERFACE.GET_PARAMS);
                CurrObjSys.GetValueEx(
                    mConn, mServerID, ID,
                    BULKDB_OBJ_INTERFACE.GET_STATE);

                CurrObjSys.SenseConfigEx(
                    mConn, mServerID, ID,
                    0xffffffff,
                    SENSE_CONFIG.ADD);
            }
        }
        public override void PushGetValue(IFConn from, uint srcid, ushort memid, byte[] infodata)
        {
            switch (memid)
            {
                case BULKDB_OBJ_INTERFACE.GET_PARAMS:
                    {
                        string json = Misc.Converter.BytesToString(infodata);

                        var p = JsonConvert.DeserializeObject<BULKDB_OBJ_INTERFACE.Pack_Params>(json);

                        Mix = p.Mix;
                    }
                    break;
                case BULKDB_OBJ_INTERFACE.GET_STATE:
                    {
                        string json = Misc.Converter.BytesToString(infodata);

                        var p = JsonConvert.DeserializeObject<BULKDB_OBJ_INTERFACE.Pack_State>(json);
                        Count = p.Count;
                        StartTime = p.StartTime;
                        EndTime = p.EndTime;
                        IsFinished = p.IsFinished;
                    }
                    break;
            }
        }

        public override void PushInfo(IFConn from, uint srcid, ushort infoid, byte[] infodata)
        {
            switch (infoid)
            {
                case BULKDB_OBJ_INTERFACE.PUSH_TEMP_FRAME_CHANGED:
                    {
                        string json = Misc.Converter.BytesToString(infodata);
                        BulkDBTempFrameChangedEventArgs e = null;
                        try
                        {
                           e = JsonConvert.DeserializeObject<BulkDBTempFrameChangedEventArgs>(json);
                        }
                        catch(Exception ex)
                        {
                            throw new Exception($"BulkDBTempFrameChangedEventArgs 解析出错,json= {json}", ex);
                        }
                        TempFrameChanged?.Invoke(this, e);
                    }
                    break;
                default:
                    PushGetValue(from, srcid, infoid, infodata);
                    break;
            }
            
        }

        public override void PushCallFunction(IFConn from, uint srcid, uint magic, ushort funcid, byte[] retdata, object AsyncDelegate, object AsyncContext)
        {
            switch (funcid)
            {
                case BULKDB_OBJ_INTERFACE.CALL_GET_FRAME:
                    {
                        string json = Misc.Converter.BytesToString(retdata);
                        var reponse = JsonConvert.DeserializeObject<Pack_GetFrameReponse>(json);
                        ((AsyncCBHandler)(AsyncDelegate))(AsyncContext, reponse);
                    }
                    break;
                case BULKDB_OBJ_INTERFACE.CALL_GET_TREND:
                    {
                        string json = Misc.Converter.BytesToString(retdata);
                        var reponse = JsonConvert.DeserializeObject<Pack_GetTrendReponse>(json);
                        ((AsyncCBHandler)(AsyncDelegate))(AsyncContext, reponse);
                    }
                    break;
                case BULKDB_OBJ_INTERFACE.CALL_GET_HISTOGRAM:
                    {
                        string json = Misc.Converter.BytesToString(retdata);
                        var reponse = JsonConvert.DeserializeObject<Pack_GetHistogramReponse>(json);
                        ((AsyncCBHandler)(AsyncDelegate))(AsyncContext, reponse);
                    }
                    break;
                case BULKDB_OBJ_INTERFACE.CALL_GET_SAMPLE:
                    {
                        string json = Misc.Converter.BytesToString(retdata);
                        var reponse = JsonConvert.DeserializeObject<Pack_GetSampleReponse>(json);
                        ((AsyncCBHandler)(AsyncDelegate))(AsyncContext, reponse);
                    }
                    break;
            }
        }


        #endregion
    }
}