using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace LifePayment.Domain.Shared;

/// <summary>
/// 集合扩展
/// </summary>
public static class ListExtensions
{
    /// <summary>
    /// 异步循环
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="list"></param>
    /// <param name="func"></param>
    /// <returns></returns>
    public static async Task ForEachAsync<T>(this List<T> list, Func<T, Task> action)
    {
        foreach (var value in list)
        {
            await action(value);
        }
    }

    /// <summary>
    /// 异步循环
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="source"></param>
    /// <param name="action"></param>
    /// <returns></returns>
    public static async Task ForEachAsync<T>(this IEnumerable<T> source, Func<T, Task> action)
    {
        foreach (var value in source)
        {
            await action(value);
        }
    }

    /// <summary>
    /// 是否为null或空集合
    /// </summary>
    /// <param name="source"></param>
    /// <returns></returns>
    public static bool IsNullOrEmpty(this IEnumerable source)
    {
        return (source == null || !source.HasItems());
    }

    /// <summary>
    /// 是否不为null或空集合
    /// </summary>
    /// <param name="source"></param>
    /// <returns></returns>
    public static bool IsNotNullOrEmpty(this IEnumerable source)
    {
        return !IsNullOrEmpty(source);
    }

    /// <summary>
    /// 是否有元素
    /// </summary>
    /// <param name="source"></param>
    /// <returns></returns>
    public static bool HasItems(this IEnumerable source)
    {
        return source != null && source.GetEnumerator().MoveNext();
    }

    ///// <summary>
    ///// 根据指定间隔字符将集合合并为字符串
    ///// </summary>
    ///// <param name="source"></param>
    ///// <param name="separator"></param>
    ///// <returns></returns>
    //public static string JoinAsString(this IEnumerable<string> source, string separator)
    //{
    //    return string.Join(separator, source);
    //}

    /// <summary>
    /// 根据指定间隔字符将集合合并为字符串
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="source"></param>
    /// <param name="separator"></param>
    /// <returns></returns>
    public static string JoinAsString<T>(this IEnumerable<T> source, string separator)
    {
        return string.Join(separator, source);
    }

    /// <summary>
    /// ICollection批量添加元素
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="collection"></param>
    /// <param name="items"></param>
    /// <exception cref="ArgumentNullException"></exception>
    public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> items)
    {
        if (collection == null)
            throw new ArgumentNullException(nameof(collection));

        if (items == null)
            throw new ArgumentNullException(nameof(items));

        if (collection is List<T> list)
        {
            list.AddRange(items);
        }
        else
        {
            foreach (var item in items)
            {
                collection.Add(item);
            }
        }
    }

    /// <summary>
    /// 转换为值为object类型的字典
    /// </summary>
    /// <typeparam name="TK"></typeparam>
    /// <typeparam name="TV"></typeparam>
    /// <param name="resource"></param>
    /// <returns></returns>
    public static Dictionary<TK, object> ToObjectDic<TK, TV>(this IDictionary<TK, TV> resource) where TV : class
    {
        var result = new Dictionary<TK, object>();
        foreach (var item in resource)
        {
            result.Add(item.Key, (object)item.Value);
        }
        return result;
    }
}