﻿using System;
using System.Collections.Generic;
using JLGames.RocketDriver.Actions.Utils;
using UnityEngine;

namespace JLGames.RocketDriver.Actions.i18n
{
    [CreateAssetMenu(fileName = "I18NSettings", menuName = "RocketDriver/I18N Settings", order = 2)]
    public class I18NSettings : ScriptableObject
    {
        public class I18NAssetInfo
        {
            private readonly string m_LangName;
            private readonly string m_FileKey;
            private readonly string m_Content;
            private readonly bool m_Default;

            public string LangName => m_LangName;
            public string FileKey => m_FileKey;
            public string Content => m_Content;
            public bool Default => m_Default;

            internal I18NAssetInfo(string langName, string fileKey, string content, bool @default)
            {
                m_LangName = langName;
                m_FileKey = fileKey;
                m_Content = content;
                m_Default = @default;
            }
        }

        [Serializable]
        public class I18NAsset
        {
            [SerializeField] private TextAsset m_Asset;
            [SerializeField] private bool m_Default;

            public TextAsset Asset => m_Asset;
            public bool Default => m_Default;
        }

        [SerializeField] private string m_AssetExtension = "json";
        [SerializeField] private I18NAsset[] m_Assets;
        private II18NDataParser m_DataParser;

        public II18NDataParser DataParser => m_DataParser;

        /// <summary>
        /// ScriptableObject下的Awake方法执行时机：
        /// 1.引擎启动时执行。
        /// 2.脚本重新编译后不会执行。
        /// </summary>
//        private void Awake()
//        {
//            DebugUtil.Log("I18NSettings.Awake");
//        }
        private void OnEnable()
        {
            if (null == m_DataParser) m_DataParser = DataParserFactory.GenDataParser(m_AssetExtension);
        }

        public I18NAssetInfo[] GetAssetInfos()
        {
            if (null == m_Assets) return null;
            if (0 == m_Assets.Length) return new I18NAssetInfo[0];
            var list = new List<I18NAssetInfo>();
            foreach (var asset in m_Assets)
            {
                if (null == asset || null == asset.Asset) continue;
                list.Add(ParseToInfo(asset));
            }

            return list.ToArray();
        }

        private I18NAssetInfo ParseToInfo(I18NAsset asset)
        {
            var textAsset = asset.Asset;
            var fileName = textAsset.name.Trim();
            var splitIndex = fileName.IndexOf('_');
            var fileKey = fileName.Substring(0, splitIndex);
            var langeName = fileName.Substring(splitIndex + 1);
            return new I18NAssetInfo(langeName, fileKey, textAsset.text, asset.Default);
        }
    }
}