using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using Misc;
using FObjBase;
using FLY.Thick.Base.IService;
using FLY.Thick.Base.OBJ_INTERFACE;
using FLY.Thick.Base.Common;

namespace FLY.Thick.Base.Client
{
    /// <summary>
    /// 边界查找服务 客户代理
    /// </summary>
    public class BorderSearchServiceClient: FObjServiceClient, IBorderSearchService
    {
        /// <summary>
        /// 边界查找服务 构造
        /// </summary>
        /// <param name="id"></param>
        public BorderSearchServiceClient(UInt32 id) : base(id) { }

        /// <summary>
        /// 边界查找服务 构造
        /// </summary>
        /// <param name="serviceId">服务id</param>
        /// <param name="connName">连接器</param>
        public BorderSearchServiceClient(UInt32 serviceId, string connName) : base(serviceId, connName) { }

        #region IBorderSearchService 成员

        public bool Enable { get; set; }


        /// <summary>
        /// 边界拐点检测，找到的边界更加精确
        /// </summary>
        public bool IsBreakDetect { get; set; } = true;

        [PropertyChanged.DoNotCheckEquality]
        public Range Valid { get; set; } = new Range();
        [PropertyChanged.DoNotCheckEquality]
        public Range Border_Backw { get; set; } = new Range();
        [PropertyChanged.DoNotCheckEquality]
        public Range Border_Forw { get; set; } = new Range();
        [PropertyChanged.DoNotCheckEquality]
        public Range Border { get; set; } = new Range();


        /// <summary>
        /// 当前膜宽，测量出来的，单位是 脉冲
        /// </summary>
        public int Width { get; set; }


        /// <summary>
        /// 膜中间位置 单位 脉冲
        /// </summary>
        public int Mid { get; set; }

        /// <summary>
        /// 调试数据更新时间
        /// </summary>
        public DateTime UpdateTime { get; set; }
        /// <summary>
        /// 手动设置温修AD值
        /// </summary>
        public bool TempADBySet { get; set; }

        public int TempAD { get; set; }

        public int TempRange { get; set; }

        /// <summary>
        /// 温修范围是温修的百分比
        /// </summary>
        public bool IsTempRangeByPercent { get; set; } = true;

        /// <summary>
        ///  温修范围百分比
        /// </summary>
        public double TempRangePercent { get; set; } = 0.02;


        public int N { get; set; }

        /// <summary>
        /// 探头直径，单位脉冲， 膜宽 = 边界范围 - 探头直径
        /// </summary>
        public int SensorWidth { get; set; }

        public int N2 { get; set; }


        public int N3 { get; set; }


        #endregion

        public void GetView(AsyncCBHandler asyncDelegate, object asyncContext)
        {
            CurrObjSys.CallFunctionEx(mConn, mServerID, ID, BORDERSEARCH_OBJ_INTERFACE.CALL_GETVIEW, null, asyncDelegate, asyncContext);
        }
        public void Apply() 
        {
            var p = new BORDERSEARCH_OBJ_INTERFACE.Pack_Params();
            p.Enable = Enable;
            p.TempADBySet = TempADBySet;
            p.TempAD = TempAD;
            p.TempRange = TempRange;
            p.N = N;
            p.N2 = N2;
            p.N3 = N3;
            p.Valid = Valid;
            p.SensorWidth = SensorWidth;
            p.IsBreakDetect = IsBreakDetect;
            p.IsTempRangeByPercent = IsTempRangeByPercent;
            p.TempRangePercent = TempRangePercent;
            string json = Newtonsoft.Json.JsonConvert.SerializeObject(p);

            //获取所有数据，设置推送
            CurrObjSys.SetValueEx(
                mConn, mServerID, ID, 
                BORDERSEARCH_OBJ_INTERFACE.SET_PARAMS,
                Misc.Converter.StringToBytes(json));
        }

        public override void ConnectNotify(IFConn from)
        {
            base.ConnectNotify(from);
            if (from.IsConnected)
            {
                //获取所有数据，设置推送
                CurrObjSys.GetValueEx(
                    mConn, mServerID, ID, 
                    BORDERSEARCH_OBJ_INTERFACE.GET_PARAMS);
                CurrObjSys.GetValueEx(
                    mConn, mServerID, ID, 
                    BORDERSEARCH_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 BORDERSEARCH_OBJ_INTERFACE.GET_PARAMS:
                    {
                        string json = Misc.Converter.BytesToString(infodata);
                        Newtonsoft.Json.JsonConvert.PopulateObject(json, this);
                    } break;
                case BORDERSEARCH_OBJ_INTERFACE.GET_STATE:
                    {
                        string json = Misc.Converter.BytesToString(infodata);
                        Newtonsoft.Json.JsonConvert.PopulateObject(json, this);
                    } break;
            }
        }
        public override void PushInfo(IFConn from, uint srcid, ushort infoid, byte[] infodata)
        {
            PushGetValue(from, srcid, infoid, infodata);
        }

        public override void PushCallFunction(IFConn from, uint srcid, uint magic, ushort funcid, byte[] retdata, object AsyncDelegate, object AsyncState)
        {
            switch (funcid) {
                case BORDERSEARCH_OBJ_INTERFACE.CALL_GETVIEW:
                    {
                        string json = Misc.Converter.BytesToString(retdata);
                        var  reponse = Newtonsoft.Json.JsonConvert.DeserializeObject<BorderSearchGetViewReponse>(json);
                        ((AsyncCBHandler)AsyncDelegate)?.Invoke(AsyncState, reponse);
                    }
                    break;
            }
        }


    }
}
