using System;
using System.Collections.Generic;
using System.Text;

namespace Apewer.Run
{

    class Config
    {

        public Config()
        {
            Test(typeof(Config).FullName, "");
            Test(typeof(Config).FullName, ",");
            Test(typeof(Config).FullName, ".");
        }

        void Test(string input, string separator)
        {
            var split = Split_Agent(input, separator);
            Console.Write(input + " | " + separator + " | ");
            Console.WriteLine(string.Join(" - ", split));
        }

        public static string[] Split_Agent(string @this, params string[] saparators)
        {
            var text = @this;
            if (string.IsNullOrEmpty(text)) return new string[0];
            if (saparators == null || saparators.LongLength < 1L) return new string[1] { text };

            var ss = new List<string>();
            foreach (var s in saparators)
            {
                if (string.IsNullOrEmpty(s)) continue;
                if (ss.Contains(s)) continue;
                ss.Add(s);
            }

            var parts = new List<string>();
            var length = 0;
            var sample = text;
            var saparator = null as string;
            while (true)
            {
                if (sample.Length < 0)
                {
                    parts.Add(sample);
                    break;
                }

                length = -1;
                saparator = null;
                foreach (var s in ss)
                {
                    var i = sample.IndexOf(s);
                    if (i > -1)
                    {
                        length = i;
                        saparator = s;
                        break;
                    }
                }

                if (saparator == null)
                {
                    parts.Add(sample);
                    break;
                }

                var part = sample.Substring(0, length);
                parts.Add(part);

                sample = sample.Substring(length + saparator.Length);
            }

            return parts.ToArray();
        }

        public static string[] Split(string argExpression, string argSeparator)
        {
            var expression = argExpression;
            var separator = argSeparator;
            if (string.IsNullOrEmpty(expression)) return new string[] { "" };
            if (string.IsNullOrEmpty(separator)) return new string[] { expression };
            if (separator.Length > expression.Length) return new string[] { expression };

            var list = new List<string>();
            var position = 0;
            var total = expression.Length;
            var length = separator.Length;
            var cell = new StringBuilder();
            while (position < total)
            {
                var read = (position + length < total) ? expression.Substring(position, length) : expression.Substring(position);
                if (read == separator)
                {
                    if (cell.Length > 0)
                    {
                        list.Add(cell.ToString());
#if NET20
                        cell = new StringBuilder();
#else
                        cell.Clear();
#endif
                    }
                    else
                    {
                        list.Add("");
                    }
                    position += length;
                }
                else
                {
                    cell.Append(expression[position]);
                    position += 1;
                }

                if (position >= total)
                {
                    list.Add(cell.ToString());
                }
            }

            var array = list.ToArray();
            return array;
        }

    }

}