﻿namespace JLGames.RocketDriver.Games.Tiledx
{
    public static class TiledMapUtil
    {
        /// <summary>
        /// Check if property exists
        /// 检查属性是否存在
        /// </summary>
        /// <param name="properties"></param>
        /// <param name="name"></param>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static bool CheckProperty(Property[] properties, string name)
        {
            if (null == properties || properties.Length == 0)
            {
                return false;
            }

            foreach (var property in properties)
            {
                if (property.name == name)
                {
                    return true;
                }
            }

            return false;
        }

        /// <summary>
        /// Find property
        /// 查找属性
        /// </summary>
        /// <param name="properties"></param>
        /// <param name="name"></param>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static Property FindProperty(Property[] properties, string name)
        {
            if (null == properties || properties.Length == 0)
            {
                return Property.Empty;
            }

            for (var i = properties.Length - 1; i >= 0; i--)
            {
                if (properties[i].name == name)
                {
                    return properties[i];
                }
            }

            return Property.Empty;
        }

        /// <summary>
        /// Find layer
        /// 查找层
        /// </summary>
        /// <param name="layers"></param>
        /// <param name="layerId"></param>
        /// <returns></returns>
        public static Layer FindLayer(Layer[] layers, int layerId)
        {
            if (null == layers || layers.Length == 0)
            {
                return null;
            }

            foreach (var layer in layers)
            {
                if (layer.id == layerId)
                {
                    return layer;
                }
            }

            return null;
        }

        /// <summary>
        /// Find layer
        /// 查找层
        /// </summary>
        /// <param name="layers"></param>
        /// <param name="layerName"></param>
        /// <returns></returns>
        public static Layer FindLayer(Layer[] layers, string layerName)
        {
            if (null == layers || layers.Length == 0)
            {
                return null;
            }

            foreach (var layer in layers)
            {
                if (layer.name == layerName)
                {
                    return layer;
                }
            }

            return null;
        }

        /// <summary>
        /// 查找地块集合
        /// </summary>
        /// <param name="tilesets">地块集合数组</param>
        /// <param name="tielsetName"></param>
        /// <returns></returns>
        public static Tileset FindCompleteTileset(Tileset[] tilesets, string tielsetName)
        {
            if (null == tilesets || tilesets.Length == 0)
            {
                return null;
            }

            foreach (var set in tilesets)
            {
                if ((set.IsExternalTileset || set.IsInternalTileset) && set.name == tielsetName)
                {
                    return set;
                }
            }

            return null;
        }

        /// <summary>
        /// 获取全部地图信息
        /// </summary>
        /// <param name="tilesets"></param>
        /// <param name="gId"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public static int GetTilePropertyInt(Tileset[] tilesets, int gId, string name)
        {
            var tile = FindTile(tilesets, gId);
            if (null == tile || !CheckProperty(tile.properties, name))
            {
                return 0;
            }

            return FindProperty(tile.properties, name).IntValue;
        }

        /// <summary>
        /// 查找地块
        /// </summary>
        /// <param name="tilesets">地块集合数组</param>
        /// <param name="gId"></param>
        /// <returns></returns>
        public static TileDefinition FindTile(Tileset[] tilesets, int gId)
        {
            if (null == tilesets || tilesets.Length == 0)
            {
                return null;
            }

            foreach (var set in tilesets)
            {
                if (set.IncludeGlobalId(gId))
                {
                    return FindTile(set.tiles, gId, set.firstgid);
                }
            }

            return null;
        }

        /// <summary>
        /// 查找地块
        /// </summary>
        /// <param name="tiles">地块数组</param>
        /// <param name="gId"></param>
        /// <param name="firstgid">id偏移量</param>
        /// <returns></returns>
        public static TileDefinition FindTile(TileDefinition[] tiles, int gId, int firstgid = 1)
        {
            if (null == tiles || tiles.Length == 0)
            {
                return null;
            }

            foreach (var tile in tiles)
            {
                if ((tile.id + firstgid) == gId)
                {
                    return tile;
                }
            }

            return null;
        }

        /// <summary>
        /// 合并连接地块集数据到完整地块集数据
        /// </summary>
        /// <param name="tilesets"></param>
        /// <param name="linkTilesets"></param>
        /// <returns></returns>
        public static Tileset[] MergeToCompleteTileset(Tileset[] tilesets, Tileset[] linkTilesets)
        {
            if (null == tilesets || tilesets.Length == 0)
            {
                return null;
            }

            if (null == linkTilesets || linkTilesets.Length == 0)
            {
                return tilesets;
            }

            for (var i0 = 0; i0 < tilesets.Length; i0++)
            {
                var tileset = tilesets[i0];
                if (tileset.DataMode == TilesetDataMode.LinkExternal)
                {
                    continue;
                }

                for (var i1 = 0; i1 < linkTilesets.Length; i1++)
                {
                    var eTileset = linkTilesets[i1];
                    if (eTileset.DataMode != TilesetDataMode.LinkExternal)
                    {
                        continue;
                    }

                    if (tileset.name == eTileset.SourceName)
                    {
                        tileset.firstgid = eTileset.firstgid;
                        break;
                    }
                }
            }

            return tilesets;
        }
    }
}