using System;
using System.Collections.Generic;
using System.Text;
using CommonLang.Xml;
using System.Xml;
using System.IO;
using CommonLang;

namespace CommonAI.Zone.ZoneEditor.Plugin
{
    // 编辑器发送到场景的消息
    namespace EditorToScene
    {
        /// <summary>
        /// 地形数据通知
        /// </summary>
        public class MsgSetScene
        {
            public string ProjectName;
            public string FileName;
            public string ResourceDir;
            public string ResourceProperty;
            public ZoneInfo Data;
        }

        /// <summary>
        /// 增加单位数据,如果单位已存在,则更新信息
        /// </summary>
        public class MsgPutUnit
        {
            public UnitData Data;
            public UnitInfo UnitData;
        }

        /// <summary>
        /// 增加物品数据,如果单位已存在,则更新信息
        /// </summary>
        public class MsgPutItem
        {
            public ItemData Data;
            public ItemTemplate Item;
        }

        /// <summary>
        /// 增加单位数据,如果单位已存在,则更新信息
        /// </summary>
        public class MsgPutPoint
        {
            public PointData Data;
        }

        /// <summary>
        /// 增加单位数据,如果单位已存在,则更新信息
        /// </summary>
        public class MsgPutRegion
        {
            public RegionData Data;
        }

        /// <summary>
        /// 增加装饰物数据,如果单位已存在,则更新信息
        /// </summary>
        public class MsgPutDecoration
        {
            public DecorationData Data;
        }

        /// <summary>
        /// 增加区域数据,如果单位已存在,则更新信息
        /// </summary>
        public class MsgPutArea
        {
            public AreaData Data;
        }

        /// <summary>
        /// 删除一个单位
        /// </summary>
        public class MsgRemoveObject
        {
            public string Name;
        }

        /// <summary>
        /// 单位被重命名
        /// </summary>
        public class MsgRenameObject
        {
            public string SrcName;
            public string DstName;
        }

        /// <summary>
        /// 由编辑器UI层选中一个单位
        /// </summary>
        public class MsgSelectObject
        {
            public string Name;
            /// <summary>
            /// 摄像机是否聚焦此单位
            /// </summary>
            public bool IsLocateCamera;
        }

        /// <summary>
        /// 设置是否显示地形阻挡
        /// </summary>
        public class MsgShowTerrain
        {
            public bool Show;
        }

        /// <summary>
        /// 定位摄像机
        /// </summary>
        public class MsgLocateCamera
        {
            public float X;
            public float Y;
        }

        /// <summary>
        /// 设置笔刷
        /// </summary>
        public class MsgSetTerrainBrush
        {
            public enum BrushType
            {
                Round,
                Rectangle,
            }

            public int ARGB = (int)(0x7F00FF00L);
            public int Size = 1;
            public BrushType Brush = BrushType.Round;

            public static float[] ToARGB_F(int ARGB)
            {
                float[] argb = new float[4];
                argb[0] = ((ARGB >> 24) & 0xFF) / 255f;
                argb[1] = ((ARGB >> 16) & 0xFF) / 255f;
                argb[2] = ((ARGB >> 8 ) & 0xFF) / 255f;
                argb[3] = ((ARGB      ) & 0xFF) / 255f;
                return argb;
            }

            public static int FromARGB_F(float[] argb)
            {
                int ARGB = 0;
                ARGB |= ((int)(argb[0] * 255)) << 24;
                ARGB |= ((int)(argb[1] * 255)) << 16;
                ARGB |= ((int)(argb[2] * 255)) << 8;
                ARGB |= ((int)(argb[3] * 255));
                return ARGB;
            }

            public static float[] ToRGBA_F(int ARGB)
            {
                float[] rgba = new float[4];
                rgba[3] = ((ARGB >> 24) & 0xFF) / 255f;
                rgba[0] = ((ARGB >> 16) & 0xFF) / 255f;
                rgba[1] = ((ARGB >> 8 ) & 0xFF) / 255f;
                rgba[2] = ((ARGB)       & 0xFF) / 255f;
                return rgba;
            }

            public static int FromRGBA_F(float[] rgba)
            {
                int ARGB = 0;
                ARGB |= ((int)(rgba[3] * 255)) << 24;
                ARGB |= ((int)(rgba[0] * 255)) << 16;
                ARGB |= ((int)(rgba[1] * 255)) << 8;
                ARGB |= ((int)(rgba[2] * 255));
                return ARGB;
            }
        }

        /// <summary>
        /// 设置编辑模式
        /// </summary>
        public class MsgSetEditorMode
        {
            public const int MODE_OBJECT = 0;
            public const int MODE_TERRAIN = 1;

            public int Mode = MODE_OBJECT;
        }

    }

    // 场景发回编辑器的消息
    namespace SceneToEditor
    {
        /// <summary>
        /// 场景初始化状态
        /// </summary>
        public class RspEditorState
        {
            public const int STATE_SUCCEED = 1;

            public int State = STATE_SUCCEED;

        }
        /// <summary>
        /// 设置笔刷
        /// </summary>
        public class RspTerrainBrushChanged
        {
            public int Size = 1;
        }

        /// <summary>
        /// 有单位被选中
        /// </summary>
        public class RspOnObjectSelected
        {
            public string Name;
            public bool Selected;
        }

        /// <summary>
        /// 有单位位置改变
        /// </summary>
        public class RspObjectPositionChanged
        {
            public string Name;
            public float x;
            public float y;
        }

        /// <summary>
        /// 有单位尺寸改变
        /// </summary>
        public class RspObjectSizeChanged
        {
            public string Name;
            public float x;
            public float y;
        }

        /// <summary>
        /// 有单位方向改变
        /// </summary>
        public class RspObjectDirectionChanged
        {
            public string Name;
            public float dir;
        }

        /// <summary>
        /// 路点链接数据改变
        /// </summary>
        public class RspPointLinkChanged
        {
            public string SrcPointName;
            public string DstPointName;
        }

        /// <summary>
        /// 最终回馈场景地形数据
        /// </summary>
        public class RspZoneFlagChanged
        {
            /// <summary>
            /// 场景坐标
            /// </summary>
            public int SceneX;
            /// <summary>
            /// 场景坐标
            /// </summary>
            public int SceneY;
            /// <summary>
            /// 标志
            /// </summary>
            public int Flag;

            public RspZoneFlagChanged() { }
            public RspZoneFlagChanged(int x, int y, int flag)
            {
                this.SceneX = x;
                this.SceneY = y;
                this.Flag = flag;
            }

            public override bool Equals(object obj)
            {
                if (obj is RspZoneFlagChanged)
                {
                    RspZoneFlagChanged other = obj as RspZoneFlagChanged;
                    return other.Flag == this.Flag && other.SceneX == this.SceneX && other.SceneY == this.SceneY;
                }
                return false;
            }
            public override int GetHashCode()
            {
                return base.GetHashCode();
            }
        }

        /// <summary>
        /// 最终回馈场景地形数据
        /// </summary>
        public class RspZoneFlagBathChanged
        {
            public List<RspZoneFlagChanged> Flags = new List<RspZoneFlagChanged>();
        }

        /// <summary>
        /// 摄像机位置或者尺寸改变
        /// </summary>
        public class RspCameraChanged
        {
            public float X;
            public float Y;
            public float W;
            public float H;
        }
    }


    public class EditorMessageDecoder
    {
        public static object DecodeMessage(string text)
        {
            byte[] buffer = Convert.FromBase64String(text);
            string xml = Encoding.UTF8.GetString(buffer);
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            object obj = XmlUtil.XmlToObject(doc);
            return obj;
        }

        public static string EncodeMessage(object msg)
        {
            XmlDocument doc = XmlUtil.ObjectToXml(msg);
            string text = doc.OuterXml;
            string str = Convert.ToBase64String(Encoding.UTF8.GetBytes(text));
            return str;
        }
    }

}