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

namespace Apewer.Internals
{

    internal class TextList
    {


        private const char Delimiter = '|';
        private const string Equal = "=";

        /// <summary>在 List 中增加项。</summary>
        public static string ListAppend(string argList, string argItem)
        {
            string vlist;
            vlist = string.IsNullOrEmpty(argList) ? "" : argList;
            if (string.IsNullOrEmpty(argItem))
            {
                return vlist;
            }
            else
            {
                if (TextHelper.Len(vlist) > 0) vlist = vlist + Delimiter;
                vlist = vlist + TextConverter.EncodeText(argItem);
                return vlist;
            }
        }

        /// <summary>解析。</summary>
        public static List<string> ListUnlash(string argText)
        {
            List<string> vlist = new List<string>();
            if (!string.IsNullOrEmpty(argText))
            {
                string[] va = TextUtility.Split(TextHelper.LCase(argText), Delimiter);
                for (int i = 0; i < va.Length; i++) vlist.Add(TextConverter.DecodeText(va[i]));
            }
            return vlist;
        }

        /// <summary>获取 List 中的元素数量。</summary>
        public static int ListCount(string argList)
        {
            int vresult;
            if (string.IsNullOrEmpty(argList)) return 0;
            try
            {
                string[] va = TextUtility.Split(argList, Delimiter);
                vresult = va.Length;
            }
            catch
            {
                vresult = -1;
            }
            return vresult;
        }

        /// <summary>更新 Args 元素。</summary>
        public static string ArgsUpdate(string argText, string argName, string argValue)
        {
            string vtext, vleft, vright;
            vtext = string.IsNullOrEmpty(argName) ? Constant.EmptyString : TextHelper.LCase(argText);
            if (string.IsNullOrEmpty(argName)) return vtext;
            else vleft = TextHelper.LCase(TextConverter.EncodeText(TextHelper.LCase(argName)));
            vright = string.IsNullOrEmpty(argValue) ? Constant.EmptyString : TextHelper.LCase(TextConverter.EncodeText(argValue));
            if (TextHelper.Len(vtext) > 0)
            {
                var vb = new TextBuilder();
                bool vupdated = false;
                string vread, vrl, vrr;
                string[] varray = TextUtility.Split(vtext, Delimiter);
                for (int i = 0; i < varray.Length; i++)
                {
                    vread = varray[i];
                    vrl = ArgLeft(vread);
                    vrr = ArgRight(vread);
                    if (i > 0) vb.Append(Delimiter.ToString());
                    if (vrl == vleft)
                    {
                        vupdated = true;
                        vb.Append(vleft + Equal + vright);
                    }
                    else
                    {
                        vb.Append(vread);
                    }
                }
                if (!vupdated) vb.Append(Delimiter + vleft + Equal + vright);
                return vb.Value;
            }
            else
            {
                return vleft + Equal + vright;
            }
        }

        /// <summary>查询 Args 中的元素。</summary>
        public static string ArgsQuery(string argText, string argName)
        {
            if ((!string.IsNullOrEmpty(argText)) && (!string.IsNullOrEmpty(argName)))
            {
                string vtext, vname;
                string[] varray;
                vtext = TextHelper.LCase(argText);
                vname = TextHelper.LCase(TextConverter.EncodeText(argName));
                varray = TextUtility.Split(vtext, Delimiter);
                for (int i = 0; i < varray.Length; i++)
                {
                    string vleft = ArgLeft(varray[i]);
                    string vright = ArgRight(varray[i]);
                    if (vleft == vname) return TextConverter.DecodeText(vright);
                }
            }
            return Constant.EmptyString;
        }

        private static string ArgLeft(string argText)
        {
            if (!string.IsNullOrEmpty(argText))
            {
                int vis = TextHelper.InStr(argText, Equal);
                if (vis > 0) return TextHelper.Left(argText, vis - 1);
            }
            return "";
        }

        private static string ArgRight(string argText)
        {
            if (!string.IsNullOrEmpty(argText))
            {
                int vis = TextHelper.InStr(argText, Equal);
                if (vis > 0) return TextHelper.Right(argText, TextHelper.Len(argText) - vis);
            }
            return "";
        }

    }

}