using System.Collections.Generic;
using System.IO;
using System.Reflection;
using Module.Log;
using UnityEngine;

// 编辑器用表格读取工具,用于避开修改自动生成的TableManager类,来读取编辑器表格的功能
public static class EditorTableManager
{
    public static List<T> GetTable<T>() where T : class
    {
        // 不缓存表格,可能有动态改表的情况
        object tableList = null;
        const string fileNameField = "TAB_FILE_DATA";
        var fileNameGetInfo = typeof(T).GetField("TAB_FILE_DATA",
            BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
        if (fileNameGetInfo == null)
        {
            LogModule.ErrorLog(string.Format("类型{0}不存在表格路径{1}", typeof(T), fileNameField));
        }
        else
        {
            var fileName = (string) fileNameGetInfo.GetValue(null);
            fileName = Path.GetFileName(fileName);
            tableList = LoadTable<T>(fileName);
        }
        return tableList as List<T>;
    }

    private static List<T> LoadTable<T>(string tableName) where T : class
    {
        var filePath = GetTablePath(tableName);
        if (!File.Exists(filePath))
        {
            LogModule.ErrorLog(string.Format("文件{0}不存在!", filePath));
        }
        else
        {
            ConstructorInfo constructor = null;
            var ctors = typeof(T).GetConstructors();
            for (var i = 0; i < ctors.Length; i++)
            {
                var parameters = ctors[i].GetParameters();
                if (parameters.Length == 1
                    && parameters[0].ParameterType == typeof(string))
                {
                    constructor = ctors[i];
                    break;
                }
            }
            if (constructor == null)
            {
                LogModule.ErrorLog(string.Format("类型{0}不存在表格形式的构造函数!", typeof(T)));
            }
            else
            {
                var list = new List<T>();
                var lines = File.ReadAllLines(filePath);
                for (var i = 2; i < lines.Length; i++)
                {
                    var line = lines[i];
                    if (!string.IsNullOrEmpty(line) && !line[0].Equals('#') && !line[0].Equals('\t'))
                    {
                        var item = (T) constructor.Invoke(new object[] {line});
                        list.Add(item);
                    }
                }
                return list;
            }
        }
        return null;
    }

    private static string GetTablePath(string tableName)
    {
        if (!Path.HasExtension(tableName))
            tableName += AssetConst.textExtension;
        return EditorCommonUtility.AssetToFilePath(LoadAssetBundle.tablePath) + tableName;
    }

    //private static void ReaderPList(string text, SerializableTable _fun, Dictionary<int, List<object>> _hash)
    //{
    //    var alldataRow = text.Split('\n');
    //    int skip = 0;
    //    string[] typeList = null;
    //    foreach (string line in alldataRow)
    //    {
    //        int nKey;
    //        if (skip == 1)
    //        {
    //            typeList = line.Split('\t');
    //            _values = new string[typeList.Length];
    //            ++skip;
    //            continue;
    //        }
    //        if (++skip < 4) continue;
    //        if (string.IsNullOrEmpty(line)) continue;
    //        if (line[0] == '#') continue;
    //        string szlinetemp = line;
    //        if (szlinetemp.Length >= 1)
    //        {
    //            if (szlinetemp[szlinetemp.Length - 1] == '\r')
    //            {
    //                szlinetemp = szlinetemp.TrimEnd('\r');
    //            }
    //        }
    //        string[] strCol = MySplit(szlinetemp, typeList, "\t");
    //        if (strCol.Length == 0) continue;
    //        string skey = strCol[0];
    //        string[] valuesList = new string[strCol.Length];

    //        if (string.IsNullOrEmpty(skey) || skey.Equals("--"))
    //        {
    //            skey = _key;
    //            nKey = Int32.Parse(skey);
    //            valuesList[0] = skey;
    //            for (int i = 1; i < strCol.Length; ++i)
    //            {
    //                if (String.IsNullOrEmpty(strCol[i]) || strCol[i] == "--")
    //                {
    //                    valuesList[i] = _values[i];
    //                }
    //                else
    //                {
    //                    valuesList[i] = strCol[i];
    //                    _values[i] = strCol[i];
    //                }
    //            }
    //        }
    //        else
    //        {
    //            _key = skey;
    //            nKey = Int32.Parse(skey);
    //            for (int i = 0; i < strCol.Length; ++i)
    //            {
    //                if (strCol[i] == "--")
    //                {
    //                    valuesList[i] = "0";
    //                    _values[i] = "0";
    //                }
    //                else
    //                {
    //                    valuesList[i] = strCol[i];
    //                    _values[i] = strCol[i];
    //                }
    //            }
    //        }
    //        _fun(valuesList, nKey, _hash);
    //    }
    //}
}