using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FObjBase;
using Misc;
using System.ComponentModel;

namespace FLY.Thick.RemoteHistory
{
    public class RemoteHistory_OBJProxy: FObj
    {
        #region 延时推送 MARKNO
        const int MARKNO_PUSH_PARAMS = 1;
        const int MARKNO_PUSH_STATE = 2;
        #endregion

        IRemoteHistory mRemoteHistory;
        public RemoteHistory_OBJProxy(int objsys_idx, UInt32 objid, IRemoteHistory remotehistory)
            : base(objsys_idx)
        {
            mRemoteHistory = remotehistory;

            ID = objid;

            mRemoteHistory.PropertyChanged += new PropertyChangedEventHandler(mRemoteHistory_PropertyChanged);
        }

        void mRemoteHistory_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if ((e.PropertyName == "KeeyDay") ||
                (e.PropertyName == "SaveRows") ||
                (e.PropertyName == "MinSaveInterval"))
            {
                FObjBase.PollModule.Current.Poll_JustOnce(
                    new PollModule.PollHandler(delegate()
                    {
                        byte[] buf;
                        GetValue(null, 0, REMOTEHISTORY_OBJ_INTERFACE.GET_PARAMS, out buf);
                        CurrObjSys.PushObjInfoEx(
                            this, REMOTEHISTORY_OBJ_INTERFACE.PUSH_PARAMS,
                            buf);
                    }), this, MARKNO_PUSH_PARAMS);
            }
            else if (
                (e.PropertyName == "CurrDays")||
                (e.PropertyName == "CurrRows") ||
                (e.PropertyName == "CurrPath"))
            {
                FObjBase.PollModule.Current.Poll_JustOnce(
                    new PollModule.PollHandler(delegate()
                    {
                        byte[] buf;
                        GetValue(null, 0, REMOTEHISTORY_OBJ_INTERFACE.GET_STATE, out buf);
                        CurrObjSys.PushObjInfoEx(
                            this, REMOTEHISTORY_OBJ_INTERFACE.PUSH_STATE,
                            buf);
                    }), this, MARKNO_PUSH_STATE);
            }
        }

        public override void CallFunction(IFConn from, UInt32 srcid, UInt32 magic, UInt16 funcid, byte[] infodata)
        {
            switch (funcid) 
            {
                case REMOTEHISTORY_OBJ_INTERFACE.CALL_FLUSH:
                    {
                        mRemoteHistory.Flush();
                        return;
                    }
                    break;
                case REMOTEHISTORY_OBJ_INTERFACE.CALL_GETPATHS:
                    {
                        REMOTEHISTORY_OBJ_INTERFACE.Pack_GetPathsRequest p = new REMOTEHISTORY_OBJ_INTERFACE.Pack_GetPathsRequest();
                        if (!p.TryParse(infodata))
                            return;
                        mRemoteHistory.GetPaths(p.dt_begin, p.dt_end, p.profilename,
                            new GetPathsReponseHandler(delegate(List<string> paths, object state)
                                {
                                    ConnContext c = (ConnContext)state;
                                    CurrObjSys.PushCallFunctionEx(c.from, c.srcid, ID, c.magic,
                                        REMOTEHISTORY_OBJ_INTERFACE.CALL_GETPATHS,
                                        new REMOTEHISTORY_OBJ_INTERFACE.Pack_GetPathsResponse() { paths = paths }.ToBytes());
                                }),
                            new ConnContext(from, srcid, magic));
                        return;
                    }break;
                case REMOTEHISTORY_OBJ_INTERFACE.CALL_GETROOTPATH:
                    {
                        mRemoteHistory.GetRootPath(
                            new GetRootPathReponseHandler(delegate(string path, object state)
                            {
                                ConnContext c = (ConnContext)state;
                                CurrObjSys.PushCallFunctionEx(c.from, c.srcid, ID, c.magic,
                                    REMOTEHISTORY_OBJ_INTERFACE.CALL_GETROOTPATH,
                                    new REMOTEHISTORY_OBJ_INTERFACE.Pack_GetRootPathResponse() { rootpath = path }.ToBytes());
                            }),
                            new ConnContext(from, srcid, magic));
                        return;
                    }break;
            }
            return;
        }

        public override void GetValue(IFConn from, uint srcid, ushort memid, out byte[] infodata)
        {
            switch (memid)
            {
                case  REMOTEHISTORY_OBJ_INTERFACE.GET_PARAMS:
                    {
                        REMOTEHISTORY_OBJ_INTERFACE.Pack_Params p = new REMOTEHISTORY_OBJ_INTERFACE.Pack_Params()
                        {
                            keeyday = mRemoteHistory.KeeyDay,
                            saverows = mRemoteHistory.SaveRows,
                            minSaveInterval = mRemoteHistory.MinSaveInterval
                        };
                        infodata = p.ToBytes();
                    } break;
                case REMOTEHISTORY_OBJ_INTERFACE.GET_STATE:
                    {
                        REMOTEHISTORY_OBJ_INTERFACE.Pack_State p = new REMOTEHISTORY_OBJ_INTERFACE.Pack_State()
                        {
                            currdays = mRemoteHistory.CurrDays,
                            currrows = mRemoteHistory.CurrRows,
                            currpath = mRemoteHistory.CurrPath
                        };
                        infodata = p.ToBytes();
                    }break;
                default:
                    infodata = null;
                    break;
            }
        }

        public override void SetValue(IFConn from, uint srcid, ushort memid, byte[] infodata)
        {
            switch (memid)
            {
                case REMOTEHISTORY_OBJ_INTERFACE.SET_PARAMS:
                    {
                        REMOTEHISTORY_OBJ_INTERFACE.Pack_Params p = new REMOTEHISTORY_OBJ_INTERFACE.Pack_Params();
                        if (p.TryParse(infodata))
                        {
                            mRemoteHistory.KeeyDay = p.keeyday;
                            mRemoteHistory.SaveRows = p.saverows;
                            mRemoteHistory.MinSaveInterval = p.minSaveInterval; 
                        }
                    } break;
            }
        }
    }
}