using System;
using System.Collections.Generic;
using System.Text;
using CommonNetwork.Sockets;
using CommonLang.Protocol;
using RoomService.Net.BsServer;
using CommonLang.Log;
using RoomService.Net.BsClient;
using CommonAI.ZoneClient;
using CommonAI.Zone;
using CommonLang.IO;
using CommonAI.Zone.ZoneEditor;
using CommonAI.ZoneServer;
using CommonAI.Zone.Instance;
using CommonLang.Concurrent;
using CommonAI.Zone.Replay;

namespace CommonAIClient.Client
{
    public abstract class BattleLocal : AbstractBattle, InstanceZoneListener
    {
        private int mRecvPack = 0;
        private int mSendPack = 0;
        private BattleRecorder mRecorder;
        private InstanceUnit mSender;
        public override int CurrentPing { get { return 0; } }
        public override long RecvPackages { get { return mRecvPack; } }
        public override long SendPackages { get { return mSendPack; } }
        public override bool IsNet { get { return false; } }
        public override RoomService.Net.BsServer.KickedByServerNotifyB2C KickMessage { get { return null; } }

        public abstract EditorScene Zone { get; }
        public SceneData SceneData { get { return Zone.Data; } }

        public BattleLocal(EditorTemplates datas)
            : base(datas)
        {
            this.Layer.ActorSyncMode =  SyncMode.ForceByServer;
        }
        protected override void Disposing()
        {
            base.Disposing();
            mSender = null;
            mRecorder = null;
        }

        public override void SendAction(CommonAI.Zone.Action action)
        {
            if (mSender == null && Layer.Actor!=null)
            {
                mSender = Zone.getUnit(Layer.Actor.ObjectID);
            }
            action.sender = mSender;
            Zone.pushAction(action);
            mSendPack++;
        }

        public void onEventHandler(Event e)
        {
            mRecvPack++;
            if (mRecorder != null)
            {
                mRecorder.Record(e, Zone.PassTimeMS);
            }
            Layer.ProcessMessage(e as IMessage);
        }
        public void onResponseHandler(InstanceZoneObject obj, ActorRequest req, ActorResponse rsp)
        {
            mRecvPack++;
            if (mRecorder != null)
            {
                mRecorder.Record(rsp, Zone.PassTimeMS);
            }
            Layer.ProcessMessage(rsp as IMessage);
        }

        /// <summary>
        /// 设置战报录像记录器
        /// </summary>
        /// <param name="recorder"></param>
        public void SetRecoder(BattleRecorder recorder)
        {
            this.mRecorder = recorder;
        }

		public bool CheckDropItem()
		{
			return false;
		}
	}
}