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

namespace Apewer.Internals
{

    internal class SortHelper
    {

        #region List<String>

        public static List<string> ListString(List<string> argList, bool argAscend)
        {
            var valid = new List<string>();

            var origin = argList;
            if (origin == null) return valid;
            if (origin.Count < 2)
            {
                if (origin.Count == 1) valid.Add(origin[0]);
                return valid;
            }

            foreach (var item in origin)
            {
                if (string.IsNullOrEmpty(item)) continue;
                var trim = item.Trim();
                if (string.IsNullOrEmpty(trim)) continue;
                valid.Add(trim);
            }

            if (argAscend) valid.Sort(new Comparison<string>(ComparisonAscend));
            else valid.Sort(new Comparison<string>(ComparisonDescend));

            return valid;
        }

        public static int ComparisonAscend(string x, string y)
        {
            return x.CompareTo(y);
        }

        public static int ComparisonDescend(string x, string y)
        {
            return y.CompareTo(x);
        }

        #endregion

        #region Dictionary<String, String>

        public static Dictionary<string, string> DictionaryStringString(Dictionary<string, string> argDictionary, bool argKey, bool argAscend)
        {
            var input = argDictionary;
            var list = new List<KeyValuePair<string, string>>(input);
            if (list.Count > 0)
            {
                try
                {
                    if (argKey)
                    {
                        if (argAscend) list.Sort(new Comparison<KeyValuePair<string, string>>(ComparisonAscendKey));
                        else list.Sort(new Comparison<KeyValuePair<string, string>>(ComparisonDescendKey));
                    }
                    else
                    {
                        if (argAscend) list.Sort(new Comparison<KeyValuePair<string, string>>(ComparisonAscendValue));
                        else list.Sort(new Comparison<KeyValuePair<string, string>>(ComparisonDescendValue));
                    }
                }
                catch
                {
                    list.Clear();
                }
            }
            var output = new Dictionary<string, string>();
            foreach (var kvp in list)
            {
                output.Add(kvp.Key, kvp.Value);
            }
            return output;
        }

        public static int ComparisonAscendKey(KeyValuePair<string, string> x, KeyValuePair<string, string> y)
        {
            return x.Key.CompareTo(y.Key);
        }

        public static int ComparisonDescendKey(KeyValuePair<string, string> x, KeyValuePair<string, string> y)
        {
            return y.Key.CompareTo(x.Key);
        }

        public static int ComparisonAscendValue(KeyValuePair<string, string> x, KeyValuePair<string, string> y)
        {
            return x.Value.CompareTo(y.Value);
        }

        public static int ComparisonDescendValue(KeyValuePair<string, string> x, KeyValuePair<string, string> y)
        {
            return y.Value.CompareTo(x.Value);
        }

        #endregion

        #region Dictionary<String, Double>

        public static Dictionary<string, double> DictionaryStringDouble(Dictionary<string, double> argDictionary, bool argKey, bool argAscend)
        {
            var input = argDictionary;
            var list = new List<KeyValuePair<string, double>>(input);
            if (list.Count > 0)
            {
                try
                {
                    if (argKey)
                    {
                        if (argAscend) list.Sort(new Comparison<KeyValuePair<string, double>>(ComparisonAscendKey));
                        else list.Sort(new Comparison<KeyValuePair<string, double>>(ComparisonDescendKey));
                    }
                    else
                    {
                        if (argAscend) list.Sort(new Comparison<KeyValuePair<string, double>>(ComparisonAscendValue));
                        else list.Sort(new Comparison<KeyValuePair<string, double>>(ComparisonDescendValue));
                    }
                }
                catch
                {
                    list.Clear();
                }
            }
            var output = new Dictionary<string, double>();
            foreach (var kvp in list)
            {
                output.Add(kvp.Key, kvp.Value);
            }
            return output;
        }

        public static int ComparisonAscendKey(KeyValuePair<string, double> x, KeyValuePair<string, double> y)
        {
            return x.Key.CompareTo(y.Key);
        }

        public static int ComparisonDescendKey(KeyValuePair<string, double> x, KeyValuePair<string, double> y)
        {
            return y.Key.CompareTo(x.Key);
        }

        public static int ComparisonAscendValue(KeyValuePair<string, double> x, KeyValuePair<string, double> y)
        {
            return x.Value.CompareTo(y.Value);
        }

        public static int ComparisonDescendValue(KeyValuePair<string, double> x, KeyValuePair<string, double> y)
        {
            return y.Value.CompareTo(x.Value);
        }

        #endregion

    }

}