#if !COMBAT_SERVER

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using LitJson;
using UnityEngine;

namespace Utility
{
    /// <summary>
    /// 用来做JsonUtility.FromJson的容器类
    /// </summary>
    [Serializable]
    public class AllPackedAssetsInfo
    {
        public List<AssetInfo> assetsList;

     
//        public List<BundleInfo> bundlsList;
    }

    [Serializable]
    public class AssetInfo
    {
        public string name;
        public string bundle;
        public string localPath;
        public bool isConfig;
        public LitJson.JsonData ToJson()
        {
            JsonData jsonData = new JsonData();
            jsonData["name"] = name;
            jsonData["bundle"] = bundle;
            jsonData["isConfig"] = isConfig;
            if (!string.IsNullOrEmpty(localPath))
            {
                jsonData["localPath"] = localPath;
            }
            return jsonData;
        }
    }

    [Serializable]
    public struct BundleInfo
    {
//        public string name;
//        public string MD5;
//        public long size;//byte
//
//        public JsonData ToJson()
//        {
//            JsonData jsonData = new JsonData();
//            jsonData["name"] = name;
//            jsonData["MD5"] = MD5;
//            jsonData["size"] = size;
//            return jsonData;
//        }
    }

    public class AssetsPacker
    {
        private static char[] splits = new char[] { '/', '.' };

        public static string SpliteName(string name)
        {
            string[] splitName = name.Split(splits);

            if (splitName.Length > 2)
            {
                return splitName[splitName.Length - 2];
            }
            else
            {
                return "";
            }
        }


//        public static BundleInfo CreateBundleInfo(string name, List<string> dependence, string MD5Value)
//        {
//            BundleInfo bundle = new BundleInfo();
//            bundle.name = SpliteName(name);
//
//            if (dependence != null)
//            {
//                dependence.ForEach(str => SpliteName(str));
//            }
//
//            bundle.MD5 = MD5Value;
//            return bundle;
//        }

        #region Write Files
        /*
        private static XmlAttribute addXmlAttribute(XmlDocument doc, string name, string val)
        {
            XmlAttribute attr = doc.CreateAttribute(name);
            attr.Value = val;
            return attr;
        }

        private static XmlNode CreateNode(AssetInfo asset, XmlDocument doc)
        {
            XmlNode node = doc.CreateElement("AssetConfig");
            node.Attributes.Append(addXmlAttribute(doc, "AssetName", asset.name));
            node.Attributes.Append(addXmlAttribute(doc, "BundleName", asset.bundle));

            if (!string.IsNullOrEmpty(asset.localPath))
            {
                node.Attributes.Append(addXmlAttribute(doc, "AssetPath", asset.localPath));
            }
            return node;
        }

        private static XmlNode CreateNode(BundleInfo bundle, XmlDocument doc)
        {
            XmlNode node = doc.CreateElement("BundleConfig");
            node.Attributes.Append(addXmlAttribute(doc, "BundleName", bundle.name));
            node.Attributes.Append(addXmlAttribute(doc, "MD5", bundle.MD5));
            node.Attributes.Append(addXmlAttribute(doc, "Size", bundle.size.SplitToString()));

            //             if (bundle.depedenceBundles != null)
            //             {
            //                 node.Attributes.Append(addXmlAttribute(doc, "DependenceCount", bundle.depedenceBundles.Count.SplitToString()));
            //                 for (int i = 0; i < bundle.depedenceBundles.Count; i++)
            //                 {
            //                     node.Attributes.Append(addXmlAttribute(doc, "DependenceBundle" + i, bundle.depedenceBundles [i]));
            //                 }
            //             }

            return node;
        }

        [ExecuteInEditMode]
        public static void WriteInfoToXMLFile(Dictionary<string, AssetInfo> assetList, Dictionary<string, BundleInfo> bundleList, string savePath)
        {
            if (null == assetList ||
                null == bundleList)
            {
                return;
            }

            XmlDocument doc = new XmlDocument();
            XmlDeclaration desc = doc.CreateXmlDeclaration("1.0", "utf-8", null);
            doc.AppendChild(desc);

            XmlElement root = doc.CreateElement("PackConfig");
            doc.AppendChild(root);

            XmlElement assetsRoot = doc.CreateElement("Assets");
            root.AppendChild(assetsRoot);
            foreach (var kvp in assetList)
            {
                XmlNode node = CreateNode(kvp.Value, doc);
                assetsRoot.AppendChild(node);
            }

            XmlElement bundlesRoot = doc.CreateElement("Bundles");
            root.AppendChild(bundlesRoot);
            foreach (var kvp in bundleList)
            {
                XmlNode node = CreateNode(kvp.Value, doc);
                bundlesRoot.AppendChild(node);
            }

            if (File.Exists(savePath))
            {
                File.Delete(savePath);
            }

            doc.Save(savePath);
        }
        */

        [ExecuteInEditMode]
        public static AllPackedAssetsInfo WriteInfoToJsonFile(Dictionary<string, AssetInfo> assetDict,
             string savePath)
        {
            AllPackedAssetsInfo allPackedInfo = new AllPackedAssetsInfo();
            allPackedInfo.assetsList = new List<AssetInfo>();
            allPackedInfo.assetsList.AddRange(assetDict.Values);
//            allPackedInfo.bundlsList = new List<BundleInfo>();
//            allPackedInfo.bundlsList.AddRange(bundleDict.Values);
            string content = JsonUtility.ToJson(allPackedInfo);
            if (File.Exists(savePath))
            {
                File.Delete(savePath);
            }
            Encoding encoding = new UTF8Encoding(false);
            File.WriteAllText(savePath, content, encoding);
            return allPackedInfo;

            //             JsonData jsonRoot = new JsonData();
            //             JsonData assetsRoot = new JsonData();
            //             JsonData bundleRoot = new JsonData();
            //             jsonRoot["Assets"] = assetsRoot;
            //             jsonRoot["Bundles"] = bundleRoot;
            //
            //             foreach (var kvp in assetDict)
            //             {
            //                 assetsRoot[kvp.Value.name] = kvp.Value.ToJson();
            //             }
            //
            //             foreach (var kvp in bundleDict)
            //             {
            //                 bundleRoot[kvp.Value.name] = kvp.Value.ToJson();
            //             }
            //
            //             if (File.Exists(savePath))
            //             {
            //                 File.Delete(savePath);
            //             }
            //             Encoding encoding = new UTF8Encoding(false);
            //             File.WriteAllText(savePath, jsonRoot.ToJson(), encoding);
        }
        #endregion
    }//AssetsPackInfo
}
#endif