using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FObjBase;
using FLY.FeedbackRenZiJia.OBJ_INTERFACE;
using FLY.Thick.Base.IService;
using FLY.FeedbackRenZiJia.IService;

namespace FLY.FeedbackRenZiJia.Server.OBJProxy
{
    public class FeedbackHeat_OBJProxy:FObj
    {
        #region markno
        public const UInt16 MARKNO_PUSH_PARAMS = 1;//参数
        public const UInt16 MARKNO_PUSH_STATE = 2;

        public const UInt16 MARKNO_PUSH_THICKS = 4;
        public const UInt16 MARKNO_PUSH_HEATS = 5;
        public const UInt16 MARKNO_PUSH_OFFSETS = 6;
        public const UInt16 MARKNO_PUSH_PREHEATS = 7;

        public const UInt16 MARKNO_PUSH_ERROR = 8;

        public const UInt16 MARKNO_PUSH_CHECKENABLE = 9;
        public const UInt16 MARKNO_PUSH_BM = 10;
        #endregion

        IFeedbackHeat data;
        public FeedbackHeat_OBJProxy(int objsys_idx, IFeedbackHeat data):base(objsys_idx)
        {
            ID = OBJ_INTERFACE_ID.FEEDBACK_ID;

            this.data = data;

            this.data.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(data_PropertyChanged);
        }


        void data_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (
                (e.PropertyName == "Delay") ||
                (e.PropertyName == "HasCheck")||
                (e.PropertyName == "Step") 
                )
            {
                FObjBase.PollModule.Current.Poll_JustOnce(
                        new PollModule.PollHandler(delegate ()
                        {
                            byte[] buf;
                            GetValue(null, 0, FEEDBACK_OBJ_INTERFACE.GET_PARAMS, out buf);
                            FObjBase.FObjSys.Current.PushObjInfoEx(
                                this, FEEDBACK_OBJ_INTERFACE.PUSH_PARAMS,
                                buf);
                        }), this, MARKNO_PUSH_PARAMS);
            }
            else if (
                (e.PropertyName == "ChannelCnt") ||
                (e.PropertyName == "NBolts") ||
                (e.PropertyName == "LastChangedTime")||
                (e.PropertyName == "IsConnectedWithPLC")
                )
            {
                FObjBase.PollModule.Current.Poll_JustOnce(
                     new PollModule.PollHandler(delegate ()
                     {
                         byte[] buf;
                         GetValue(null, 0, FEEDBACK_OBJ_INTERFACE.GET_STATE, out buf);
                         FObjBase.FObjSys.Current.PushObjInfoEx(
                             this, FEEDBACK_OBJ_INTERFACE.PUSH_STATE,
                             buf);
                     }), this, MARKNO_PUSH_STATE);
            }
            else if ((e.PropertyName == "Bads") ||
                (e.PropertyName == "HasFan") ||
                (e.PropertyName == "HasElectricity") ||
                (e.PropertyName == "CheckNo") ||
                (e.PropertyName == "ErrNo"))
            {
                FObjBase.PollModule.Current.Poll_JustOnce(
                     new PollModule.PollHandler(delegate ()
                     {
                         byte[] buf;
                         GetValue(null, 0, FEEDBACK_OBJ_INTERFACE.GET_ERROR, out buf);
                         FObjBase.FObjSys.Current.PushObjInfoEx(
                             this, FEEDBACK_OBJ_INTERFACE.PUSH_ERROR,
                             buf);
                     }), this, MARKNO_PUSH_ERROR);
            }
            else if (e.PropertyName == "CheckEnable")
            {
                byte[] buf;
                GetValue(null, 0, FEEDBACK_OBJ_INTERFACE.GET_CHECKENABLE, out buf);
                FObjBase.FObjSys.Current.PushObjInfoEx(
                    this, FEEDBACK_OBJ_INTERFACE.PUSH_CHECKENABLE,
                    buf);
            }
            else if (e.PropertyName == "IsAuto")
            {
                byte[] buf;
                GetValue(null, 0, FEEDBACK_OBJ_INTERFACE.GET_ENABLE, out buf);
                FObjBase.FObjSys.Current.PushObjInfoEx(
                    this, FEEDBACK_OBJ_INTERFACE.PUSH_ENABLE,
                    buf);
            }
            else if (e.PropertyName == "HeatsProductName")
            {
                byte[] buf;
                GetValue(null, 0, FEEDBACK_OBJ_INTERFACE.GET_PRODUCTNAME, out buf);
                FObjBase.FObjSys.Current.PushObjInfoEx(
                    this, FEEDBACK_OBJ_INTERFACE.PUSH_PRODUCTNAME,
                    buf);
            }
            else if (e.PropertyName == "UndoIdx")
            {
                byte[] buf;
                GetValue(null, 0, FEEDBACK_OBJ_INTERFACE.GET_UNDOIDX, out buf);
                FObjBase.FObjSys.Current.PushObjInfoEx(
                    this, FEEDBACK_OBJ_INTERFACE.PUSH_UNDOIDX,
                    buf);
            }

        }


        public override void GetValue(IFConn from, uint srcid, ushort memid, out byte[] infodata)
        {
            infodata = null;
            switch (memid) 
            {
                case FEEDBACK_OBJ_INTERFACE.GET_PARAMS:
                    {
                        infodata = new FEEDBACK_OBJ_INTERFACE.Pack_Params()
                        {
                            delay = data.Delay,
                            hasCheck = data.HasCheck,
                            step = data.Step,
                            HasCheckFilmVelocity = data.HasCheckFilmVelocity
                        }.ToBytes();
                    }break;
                case FEEDBACK_OBJ_INTERFACE.GET_STATE:
                    {
                        infodata = new FEEDBACK_OBJ_INTERFACE.Pack_Status()
                        {
                            channelcnt = data.ChannelCnt,
                            nbolts = data.NBolts,
                            isConnected = data.IsConnectedWithPLC,
                            
                            
                            lastChangedTime = data.LastChangedTime
                            
                        }.ToBytes();
                    }break;
                case FEEDBACK_OBJ_INTERFACE.GET_ERROR:
                    {
                        infodata = new FEEDBACK_OBJ_INTERFACE.Pack_Error()
                        {
                            hasFan = data.HasFan,
                            hasEletric = data.HasElectricity,
                            checkno = data.CheckNo,
                            bads = data.Bads
                        }.ToBytes();
                    } break;
                case FEEDBACK_OBJ_INTERFACE.GET_CHECKENABLE:
                    {
                        infodata = new FEEDBACK_OBJ_INTERFACE.Pack_Enable
                        {
                            enable = data.CheckEnable
                        }.ToBytes();
                    }break;
                case FEEDBACK_OBJ_INTERFACE.GET_ENABLE:
                    {
                        infodata = new FEEDBACK_OBJ_INTERFACE.Pack_Enable
                        {
                            enable = data.IsAuto
                        }.ToBytes();
                    } break;
                case FEEDBACK_OBJ_INTERFACE.GET_PRODUCTNAME:
                    {
                        infodata = new FEEDBACK_OBJ_INTERFACE.Pack_String
                        {
                            data = data.HeatsProductName
                        }.ToBytes();                       
                    }break;
                case FEEDBACK_OBJ_INTERFACE.GET_UNDOIDX:
                    {
                        infodata = new FEEDBACK_OBJ_INTERFACE.Pack_Undo
                        {
                            undo_idx = data.UndoIdx
                        }.ToBytes();
                    }
                    break;
            }
        }
        public override void SetValue(IFConn from, uint srcid, ushort memid, byte[] infodata)
        {
            switch (memid) 
            {
                case FEEDBACK_OBJ_INTERFACE.SET_PARAMS:
                    {
                        FEEDBACK_OBJ_INTERFACE.Pack_Params p = new FEEDBACK_OBJ_INTERFACE.Pack_Params();
                        if (!p.TryParse(infodata))
                            return;
                        
                        data.Step = p.step;
                        data.Delay = p.delay;
                        data.HasCheck = p.hasCheck;
                        data.HasCheckFilmVelocity = p.HasCheckFilmVelocity;
                        data.Apply();
                    }break;
                case FEEDBACK_OBJ_INTERFACE.SET_CHECKENABLE:
                    {
                        FEEDBACK_OBJ_INTERFACE.Pack_Enable p = new FEEDBACK_OBJ_INTERFACE.Pack_Enable();
                        if (!p.TryParse(infodata))
                            return;
                        data.CheckEnable = p.enable;
                    }break;
                case FEEDBACK_OBJ_INTERFACE.SET_ENABLE:
                    {
                        FEEDBACK_OBJ_INTERFACE.Pack_Enable p = new FEEDBACK_OBJ_INTERFACE.Pack_Enable();
                        if (!p.TryParse(infodata))
                            return;
                        data.IsAuto = p.enable;
                    } break;
            }
        }

        public override void CallFunction(IFConn from, uint srcid, uint magic, ushort funcid, byte[] infodata)
        {
            switch (funcid) 
            {
                case FEEDBACK_OBJ_INTERFACE.CALL_SAVEHEATS:
                    {
                        FEEDBACK_OBJ_INTERFACE.Pack_String p = new FEEDBACK_OBJ_INTERFACE.Pack_String();
                        if (!p.TryParse(infodata))
                            return;
                        data.SaveHeats(p.data);
                    }break;
                case FEEDBACK_OBJ_INTERFACE.CALL_LOADHEATS:
                    {
                        FEEDBACK_OBJ_INTERFACE.Pack_String p = new FEEDBACK_OBJ_INTERFACE.Pack_String();
                        if (!p.TryParse(infodata))
                            return;
                        data.LoadHeatsFile(p.data);
                    }break;
                case FEEDBACK_OBJ_INTERFACE.CALL_DEL:
                    {
                        FEEDBACK_OBJ_INTERFACE.Pack_String p = new FEEDBACK_OBJ_INTERFACE.Pack_String();
                        if (!p.TryParse(infodata))
                            return;
                        data.DelHeatsFile(p.data);
                    }break;
                case FEEDBACK_OBJ_INTERFACE.CALL_GETLIST:
                    {
                        data.GetHeatsFileList(
                            new AsyncCBHandler(delegate(object AsyncState, object retdata)
                            {
                                ConnContext context = (ConnContext)AsyncState;
                                FEEDBACK_OBJ_INTERFACE.Pack_StringList p = new FEEDBACK_OBJ_INTERFACE.Pack_StringList();
                                p.list = (List<string>)retdata;

                                CurrObjSys.PushCallFunctionEx(
                                    context.from,
                                    context.srcid,
                                    ID,
                                    context.magic,
                                    FEEDBACK_OBJ_INTERFACE.CALL_GETLIST,
                                    p.ToBytes());
                            }), new ConnContext(from, srcid, magic));
                    } break;

                case FEEDBACK_OBJ_INTERFACE.CALL_UNDO:
                    {
                        data.Undo();
                    }break;

            }
        }

    }
}