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

namespace Apewer
{

    /// <summary>排序实用工具。</summary>
    public class SortUtility
    {

        #region compare

        /// <exception cref="ArgumentException"></exception>
        public static int Ascend<T>(T a, T b) where T : IComparable
        {
            if (a == null) return b == null ? 0 : b.CompareTo(a);
            return b == null ? 1 : a.CompareTo(b);
        }

        /// <exception cref="ArgumentException"></exception>
        public static int Descend<T>(T a, T b) where T : IComparable
        {
            return 0 - Ascend(a, b);
        }

        /// <exception cref="ArgumentException"></exception>
        public static int AscendT<T>(T a, T b) where T : IComparable<T>
        {
            if (a == null) return b == null ? 0 : b.CompareTo(a);
            return b == null ? 1 : a.CompareTo(b);
        }

        /// <exception cref="ArgumentException"></exception>
        public static int DescendT<T>(T a, T b) where T : IComparable<T>
        {
            return 0 - AscendT(a, b);
        }

        #endregion

        #region enumerable

        /// <summary>升序排序。</summary>
        public static List<T> Ascend<T>(IEnumerable<T> items) where T : IComparable
        {
            var list = new List<T>(items);
            list.Sort(Ascend);
            return list;
        }

        /// <summary>降序排序。</summary>
        public static List<T> Descend<T>(IEnumerable<T> items) where T : IComparable
        {
            var list = new List<T>(items);
            list.Sort(Descend);
            return list;
        }

        /// <summary>升序排序。</summary>
        public static List<T> AscendT<T>(IEnumerable<T> items) where T : IComparable<T>
        {
            var list = new List<T>(items);
            list.Sort(AscendT);
            return list;
        }

        /// <summary>降序排序。</summary>
        public static List<T> DescendT<T>(IEnumerable<T> items) where T : IComparable<T>
        {
            var list = new List<T>(items);
            list.Sort(DescendT);
            return list;
        }

        #endregion

        #region dictionary

        /// <summary>对 Key 排序。</summary>
        public static List<KeyValuePair<TKey, TValue>> Keys<TKey, TValue>(Dictionary<TKey, TValue> target, Comparison<TKey> comparison) where TKey : IComparable<TKey>
        {
            if (target == null) return null;

            var keys = new List<TKey>();
            keys.AddRange(target.Keys);
            if (comparison == null) keys.Sort();
            else keys.Sort(comparison);

            var output = new List<KeyValuePair<TKey, TValue>>();
            foreach (var key in keys) output.Add(key, target[key]);

            return output;
        }

        /// <summary>对 Key 升序排序。</summary>
        public static List<KeyValuePair<TKey, TValue>> KeysAscend<TKey, TValue>(Dictionary<TKey, TValue> target) where TKey : IComparable<TKey>
        {
            return Keys(target, new Comparison<TKey>(AscendT));
        }

        /// <summary>对 Key 升序排序。</summary>
        public static List<KeyValuePair<TKey, TValue>> KeysDescend<TKey, TValue>(Dictionary<TKey, TValue> target) where TKey : IComparable<TKey>
        {
            return Keys(target, new Comparison<TKey>(DescendT));
        }

        /// <summary>对 Key 升序排序。</summary>
        public static Dictionary<string, string> SortKeyAscend(Dictionary<string, string> dictionary)
        {
            return SortHelper.DictionaryStringString(dictionary, true, true);
        }

        /// <summary>对 Key 降序排序。</summary>
        public static Dictionary<string, string> SortKeyDecend(Dictionary<string, string> dictionary)
        {
            return SortHelper.DictionaryStringString(dictionary, true, false);
        }

        /// <summary>对 Value 升序排序。</summary>
        public static Dictionary<string, string> SortValueAscend(Dictionary<string, string> dictionary)
        {
            return SortHelper.DictionaryStringString(dictionary, false, true);
        }

        /// <summary>对 Value 降序排序。</summary>
        public static Dictionary<string, string> SortValueDecend(Dictionary<string, string> dictionary)
        {
            return SortHelper.DictionaryStringString(dictionary, false, false);
        }

        /// <summary>对 Key 升序排序。</summary>
        public static Dictionary<string, double> SortKeyAscend(Dictionary<string, double> dictionary)
        {
            return SortHelper.DictionaryStringDouble(dictionary, true, true);
        }

        /// <summary>对 Key 降序排序。</summary>
        public static Dictionary<string, double> SortKeyDecend(Dictionary<string, double> dictionary)
        {
            return SortHelper.DictionaryStringDouble(dictionary, true, false);
        }

        /// <summary>对 Value 升序排序。</summary>
        public static Dictionary<string, double> SortValueAscend(Dictionary<string, double> dictionary)
        {
            return SortHelper.DictionaryStringDouble(dictionary, false, true);
        }

        /// <summary>对 Value 降序排序。</summary>
        public static Dictionary<string, double> SortValueDecend(Dictionary<string, double> dictionary)
        {
            return SortHelper.DictionaryStringDouble(dictionary, false, false);
        }

        #endregion

    }

}