using System;
using CommonAI.Zone;
using CommonLang.IO;
using CommonLang.IO.Attribute;
using System.Collections.Generic;

namespace XmdsCommonServer.Message
{

    public interface MessagePlayerEventB2R
    {
        string eventName { get; set; }
        string playerId { get; set; }
    }

    public interface MessageZoneEventB2R
    {
        string eventName { get; set; }
        string instanceId { get; set; }
    }

	public interface MessageMapEventB2R
	{
		string eventName { get; set; }
	}

	/// <summary>
	/// 战斗服通知游戏服扣道具.
	/// </summary>
	[MessageType(0xF000009)]
    public class ConsumeItemEventB2R : PlayerEvent, MessagePlayerEventB2R
    {
        public string eventName { get; set; }
        public string playerId { get; set; }
        public string Type = null;
        public int Qty = 0;
        public string Reason = null;

        public ConsumeItemEventB2R() { }

        public ConsumeItemEventB2R(string p, string t, int q, string r)
        {
            playerId = p;
            Type = t;
            Qty = q;
            Reason = r;
        }

        override public void WriteExternal(IOutputStream output)
        {
            base.WriteExternal(output);
            output.PutUTF(playerId);
            output.PutUTF(Type);
            output.PutS32(Qty);
            output.PutUTF(Reason);
        }
        override public void ReadExternal(IInputStream input)
        {
            base.ReadExternal(input);
            playerId = input.GetUTF();
            Type = input.GetUTF();
            Qty = input.GetS32();
            Reason = input.GetUTF();
        }
    }

    /// <summary>
    /// 通知游戏服传送单位.
    /// </summary>
    [MessageType((0xF000017))]
    public class TransUnitEventB2R : PlayerEvent, MessagePlayerEventB2R
    {
        public string eventName { get; set; }

        public string playerId { get; set; }
        public int SceneID = 0;
        public int TargetX = 0;
        public int TargetY = 0;

        public TransUnitEventB2R() { }

        public override void ReadExternal(IInputStream input)
        {
            base.ReadExternal(input);
            playerId = input.GetUTF();
            SceneID = input.GetS32();
            TargetX = input.GetS32();
            TargetY = input.GetS32();
        }

        public override void WriteExternal(IOutputStream output)
        {
            base.WriteExternal(output);
            output.PutUTF(playerId);
            output.PutS32(SceneID);
            output.PutS32(TargetX);
            output.PutS32(TargetY);
        }
    }

    /// <summary>
    /// 坐骑变更通知.
    /// </summary>
    [MessageType((0xF000018))]
    public class SummonMountEventB2R : PlayerEvent, MessagePlayerEventB2R
    {
        public string eventName { get; set; }
        /// <summary>
        /// 单位UUID.
        /// </summary>
        public string playerId { get; set; }
        /// <summary>
        /// 坐骑ID.
        /// </summary>
        public bool IsSummonMount = false;

        public override void ReadExternal(IInputStream input)
        {
            base.ReadExternal(input);
            playerId = input.GetUTF();
            IsSummonMount = input.GetBool();
        }

        public override void WriteExternal(IOutputStream output)
        {
            base.WriteExternal(output);
            output.PutUTF(playerId);
            output.PutBool(IsSummonMount);
        }
    }

    /// <summary>
    /// 通知游戏服弹框.
    /// </summary>
    [MessageType((0xF000021))]
    public class ShowRebirthDialogueB2R : PlayerEvent, MessagePlayerEventB2R
    {
        public string eventName { get; set; }

        /// <summary>
        /// 单位UUID.
        /// </summary>
        public string playerId { get; set; }
        /// <summary>
        /// 死亡单位UUID.
        /// </summary>
        public string DeadUnitUUID = null;
        /// <summary>
        /// 施救者名字.
        /// </summary>
        public string SaverName = null;
        /// <summary>
        /// 施救者名字.
        /// </summary>
        public string SaverUUID = null;
        /// <summary>
        /// 复活后恢复HP
        /// </summary>
        public int HP = 0;
        /// <summary>
        /// 复活后恢复MP
        /// </summary>
        public int MP = 0;

        public override void WriteExternal(IOutputStream output)
        {
            base.WriteExternal(output);
            output.PutUTF(DeadUnitUUID);
            output.PutUTF(SaverName);
            output.PutUTF(SaverUUID);
            output.PutS32(HP);
            output.PutS32(MP);
        }

        public override void ReadExternal(IInputStream input)
        {
            base.ReadExternal(input);
            DeadUnitUUID = input.GetUTF();
            SaverName = input.GetUTF();
            SaverUUID = input.GetUTF();
            HP = input.GetS32();
            MP = input.GetS32();
        }


    }

    /// <summary>
    /// 通知游戏服触发事件.
    /// </summary>
    [MessageType((0xFFF0001))]
    public class TriggerSceneEventB2R : PlayerEvent, MessagePlayerEventB2R
    {
        public string EventID = null;
        public string playerId { get; set; }

        public string eventName { get; set; }

        public TriggerSceneEventB2R() { }

        public override void ReadExternal(IInputStream input)
        {
            base.ReadExternal(input);
            EventID = input.GetUTF();
            playerId = input.GetUTF();
        }

        public override void WriteExternal(IOutputStream output)
        {
            base.WriteExternal(output);
            output.PutUTF(EventID);
            output.PutUTF(playerId);
        }
    }

    /// <summary>
    /// 向游戏服发送战报信息.
    /// </summary>
    [MessageType((0xFFF0002))]
    public class BattleReportEventB2R : ZoneEvent, MessageZoneEventB2R
    {
        public string eventName { get; set; }

        /// <summary>
        /// 场景号.
        /// </summary>
        public string instanceId { get; set; }

        public List<UnitBattleReportDetail> data = null;

        public override void ReadExternal(IInputStream input)
        {
            instanceId = input.GetUTF();
            this.data = input.GetList<UnitBattleReportDetail>(input.GetExt<UnitBattleReportDetail>);
        }

        public override void WriteExternal(IOutputStream output)
        {
            output.PutUTF(instanceId);
            output.PutList(this.data, output.PutExt);
        }

    }

    /// <summary>
    ///单位战报详细信息.
    /// </summary>
    [MessageType((0xFFF0003))]
    public class UnitBattleReportDetail : IExternalizable
    {
        public uint ID = 0;
        /// <summary>
        /// 单位UUID
        /// </summary>
        public string PlayerUUID = null;
        /// <summary>
        /// 单位模板id
        /// </summary>
        public int TemplateID = 0;
        /// <summary>
        /// 单位阵营
        /// </summary>
        public int Force = 0;
        /// <summary>
        /// 总伤害.
        /// </summary>
        public long TotalDamage = 0;
        /// <summary>
        /// 总治疗量.
        /// </summary>
        public long TotalHealing = 0;

        public void ReadExternal(IInputStream input)
        {
            ID = input.GetU32();
            PlayerUUID = input.GetUTF();
            TemplateID = input.GetS32();
            Force = input.GetS32();
            TotalDamage = input.GetS64();
            TotalHealing = input.GetS64();
        }

        public void WriteExternal(IOutputStream output)
        {
            output.PutU32(ID);
            output.PutUTF(PlayerUUID);
            output.PutS32(TemplateID);
            output.PutS32(Force);
            output.PutS64(TotalDamage);
            output.PutS64(TotalHealing);
        }
    }

    /// <summary>
    /// 通知游戏服谁击杀了BOSS.
    /// </summary>
    [MessageType((0xFFF0004))]
    public class KillBossEventB2R : ZoneEvent, MessageZoneEventB2R
    {
        public string eventName { get; set; }

        /// <summary>
        /// 场景ID.
        /// </summary>
        public string instanceId { get; set; }

        public string PlayerUUID = null;

		public override void ReadExternal(IInputStream input)
		{
			PlayerUUID = input.GetUTF();
			instanceId = input.GetUTF();
		}

		public override void WriteExternal(IOutputStream output)
		{
			output.PutUTF(PlayerUUID);
			output.PutUTF(instanceId);
		}
	}

    /// <summary>
    /// 玩家异常.
    /// </summary>
    [MessageType((0xFFF0005))]
    public class PlayerExceptionEventB2R : PlayerEvent, MessagePlayerEventB2R
    {
        public string playerId { get; set; }
        /// <summary>
        /// 场景ID.
        /// </summary>
        public string instanceId { get; set; }

        public string eventName { get; set; }
        public string reason { get; set; }
    }

	/// <summary>
	/// 山大王小弟护卫事件触发
	/// </summary>
	[MessageType((0xFFF0006))]
	public class MountainKingHelpEventB2R : ZoneEvent, MessageMapEventB2R
	{
		public string eventName { get; set; }

		public int mapId;
		/// <summary>
		/// 场景ID.
		/// </summary>
		public int monsterId;

		public uint monsterObjectId;
		public List<string> players = new List<string>();

		public override void ReadExternal(IInputStream input)
		{
			throw new NotImplementedException();
		}

		public override void WriteExternal(IOutputStream output)
		{
			throw new NotImplementedException();
		}
	}

}