
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace Stary.Evo
{
#if UNITY_EDITOR
    [ClassAPI("01.FluentAPI.CSharp", "System.String", 1)]
    [APIDescriptionCN("针对 System.String 提供的链式扩展，理论上任何集合都可以使用")]
    [APIDescriptionEN("The chain extension provided by System.Collections can theoretically be used by any collection")]
#endif
    public static class SystemStringExtension
    {
#if UNITY_EDITOR
        // v1 No.18
        [MethodAPI]
        [APIDescriptionCN("检测是否为空或 Empty")]
        [APIDescriptionEN("Check Whether string is null or empty")]
        [APIExampleCode(@"
Debug.Log(string.Empty.IsNullOrEmpty());
// true
        ")]
#endif
        public static bool IsNullOrEmpty(this string selfStr)
        {
            return string.IsNullOrEmpty(selfStr);
        }


#if UNITY_EDITOR
        // v1 No.19
        [MethodAPI]
        [APIDescriptionCN("检测是否为非空且非Empty")]
        [APIDescriptionEN("Checks both not null and non-empty")]
        [APIExampleCode(@"
Debug.Log(""Hello"".IsNotNullAndEmpty());
// true
        ")]
#endif
        public static bool IsNotNullAndEmpty(this string selfStr)
        {
            return !string.IsNullOrEmpty(selfStr);
        }

#if UNITY_EDITOR
        // v1 No.20
        [MethodAPI]
        [APIDescriptionCN("去掉两端空格后，检测是否为空或 Empty")]
        [APIDescriptionEN("Check if it is Empty or Empty after removing whitespace from both sides")]
        [APIExampleCode(@"
Debug.Log(""   "".IsTrimNullOrEmpty());
// true
        ")]
#endif
        public static bool IsTrimNullOrEmpty(this string selfStr)
        {
            return selfStr == null || string.IsNullOrEmpty(selfStr.Trim());
        }

        /// <summary>
        /// Check Whether string trim is null or empty
        /// </summary>
        /// <param name="selfStr"></param>
        /// <returns></returns>
#if UNITY_EDITOR
        // v1 No.21
        [MethodAPI]
        [APIDescriptionCN("去掉两端空格后，检测是否为非 null 且非 Empty")]
        [APIDescriptionEN("After removing whitespace from both sides, check whether it is non-null and non-empty")]
        [APIExampleCode(@"
Debug.Log(""  123  "".IsTrimNotNullAndEmpty());
// true
        ")]
#endif
        public static bool IsTrimNotNullAndEmpty(this string selfStr)
        {
            return selfStr != null && !string.IsNullOrEmpty(selfStr.Trim());
        }


        /// <summary>
        /// 缓存
        /// </summary>
        private static readonly char[] mCachedSplitCharArray = { '.' };

#if UNITY_EDITOR
        // v1 No.22
        [MethodAPI]
        [APIDescriptionCN("字符串分割")]
        [APIDescriptionEN("String splitting")]
        [APIExampleCode(@"
""1.2.3.4.5"".Split('.').ForEach(str=>Debug.Log(str));
// 1 2 3 4 5
        ")]
#endif
        public static string[] Split(this string selfStr, char splitSymbol)
        {
            mCachedSplitCharArray[0] = splitSymbol;
            return selfStr.Split(mCachedSplitCharArray);
        }

#if UNITY_EDITOR
        // v1 No.23
        [MethodAPI]
        [APIDescriptionCN("格式化字符串填充参数")]
        [APIDescriptionEN("The format string populates the parameters")]
        [APIExampleCode(@"

var newStr = ""{0},{1}"".FillFormat(1,2);
Debug.Log(newStr);
// 1,2
        ")]
#endif
        public static string FillFormat(this string selfStr, params object[] args)
        {
            return string.Format(selfStr, args);
        }

#if UNITY_EDITOR
        // v1 No.24
        [MethodAPI]
        [APIDescriptionCN("返回包含此字符串的 StringBuilder")]
        [APIDescriptionEN("Returns a StringBuilder containing this string")]
        [APIExampleCode(@"
var builder = ""Hello"".Builder();
builder.Append("" QF"");
Debug.Log(builder.ToString());
// Hello QF
        ")]
#endif
        public static StringBuilder Builder(this string selfStr)
        {
            return new StringBuilder(selfStr);
        }

#if UNITY_EDITOR
        // v1 No.25
        [MethodAPI]
        [APIDescriptionCN("StringBuilder 添加前缀")]
        [APIDescriptionEN("StringBuilder insert prefix string")]
        [APIExampleCode(@"
var builder = ""I'm liangxie"".Builder().AddPrefix(""Hi!"") ;
Debug.Log(builder.ToString());
// Hi!I'm liangxie
        ")]
#endif
        public static StringBuilder AddPrefix(this StringBuilder self, string prefixString)
        {
            self.Insert(0, prefixString);
            return self;
        }


#if UNITY_EDITOR
        // v1 No.26
        [MethodAPI]
        [APIDescriptionCN("字符串解析成 Int")]
        [APIDescriptionEN("parse string to int")]
        [APIExampleCode(@"
var number = ""123456"".ToInt();
Debug.Log(number);
// 123456
// notice unsafe
// 不安全
        ")]
#endif
        public static int ToInt(this string selfStr, int defaulValue = 0)
        {
            var retValue = defaulValue;
            return int.TryParse(selfStr, out retValue) ? retValue : defaulValue;
        }

        public static long ToLong(this string self, long defaultValue = 0)
        {
            var retValue = defaultValue;
            return long.TryParse(self, out retValue) ? retValue : defaultValue;
        }

#if UNITY_EDITOR
        // v1 No.27
        [MethodAPI]
        [APIDescriptionCN("字符串解析成 Int")]
        [APIDescriptionEN("parse string to int")]
        [APIExampleCode(@"
DateTime.Now.ToString().ToDataTime();
        ")]
#endif
        public static DateTime ToDateTime(this string selfStr, DateTime defaultValue = default(DateTime))
        {
            return DateTime.TryParse(selfStr, out var retValue) ? retValue : defaultValue;
        }


#if UNITY_EDITOR
        // v1 No.28
        [MethodAPI]
        [APIDescriptionCN("字符串解析成 float")]
        [APIDescriptionEN("parse string to float")]
        [APIExampleCode(@"
var number = ""123456f"".ToInt();
Debug.Log(number);
// 123456
// notice unsafe
// 不安全
        ")]
#endif
        public static float ToFloat(this string selfStr, float defaultValue = 0)
        {
            return float.TryParse(selfStr, out var retValue) ? retValue : defaultValue;
        }

#if UNITY_EDITOR
        // v1 No.29
        [MethodAPI]
        [APIDescriptionCN("是否存在中文字符")]
        [APIDescriptionEN("check string contains chinese or not")]
        [APIExampleCode(@"
Debug.Log(""你好"".HasChinese());
// true
")]
#endif
        public static bool HasChinese(this string input)
        {
            return Regex.IsMatch(input, @"[\u4e00-\u9fa5]");
        }

#if UNITY_EDITOR
        // v1 No.30
        [MethodAPI]
        [APIDescriptionCN("是否存在空格")]
        [APIDescriptionEN("check string contains space or not")]
        [APIExampleCode(@"
Debug.Log(""你好 "".HasSpace());
// true
")]
#endif
        public static bool HasSpace(this string input)
        {
            return input.Contains(" ");
        }

#if UNITY_EDITOR
        // v1 No.31
        [MethodAPI]
        [APIDescriptionCN("remove string")]
        [APIDescriptionEN("check string contains space or not")]
        [APIExampleCode(@"
Debug.Log(""Hello World "".RemoveString(""Hello"","" ""));
// World
")]
#endif
        public static string RemoveString(this string str, params string[] targets)
        {
            return targets.Aggregate(str, (current, t) => current.Replace(t, string.Empty));
        }

#if UNITY_EDITOR
        // v1.0.39
        [MethodAPI]
        [APIDescriptionCN("join string")]
        [APIDescriptionEN("join string")]
        [APIExampleCode(@"
Debug.Log(new List<string>() { ""1"",""2"",""3""}.StringJoin("",""));
// 1,2,3
")]
#endif
        public static string StringJoin(this IEnumerable<string> self, string separator)
        {
            return string.Join(separator, self);
        }
    }
}