using System;
using System.Security.Cryptography;

namespace CallCenter.Utility
{
    public class RandString
    {
        #region 随机字符串,随机数

        private static readonly string _LowerChar = "abcdefghijklmnopqrstuvwxyz";
        private static readonly string _UpperChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        private static readonly string _NumberChar = "0123456789";

        #region 获取种子
        /**/
        /// <summary>
        /// 使用RNGCryptoServiceProvider 做种，可以在一秒内产生的随机数重复率非常
        /// 的低，对于以往使用时间做种的方法是个升级
        /// </summary>
        /// <returns></returns>
        #endregion
        public static int GetNewSeed()
        {
            var rndBytes = new byte[4];
            var rng = new RNGCryptoServiceProvider();
            rng.GetBytes(rndBytes);
            return BitConverter.ToInt32(rndBytes, 0);
        }


        #region 取得指定范围内的数字随几数
        /**/
        /// <summary>
        /// 取得指定范围内的随几数
        /// </summary>
        /// <param name="startNumber">下限数</param>
        /// <param name="endNumber">上限数</param>
        /// <returns>int</returns>
        #endregion
        public static int GetRandomNumber(int startNumber, int endNumber)
        {
            var objRandom = new Random(GetNewSeed());
            int r = objRandom.Next(startNumber, endNumber);
            return r;
        }


        #region 获取指定 ASCII 范围内的随机字符串
        /**/
        /// <summary>
        /// 获取指定 ASCII 范围内的随机字符串
        /// </summary>
        /// <param name="resultLength">结果字符串长度</param>
        /// <param name="startNumber"> 开始的ASCII值 如（33－125）中的 33</param>
        /// <param name="endNumber"> 结束的ASCII值 如（33－125）中的 125</param>
        /// <returns></returns>
        #endregion
        public static string GetRandomStringByASCII(int resultLength, int startNumber, int endNumber)
        {
            var objRandom = new Random(GetNewSeed());
            string result = null;
            for (int i = 0; i < resultLength; i++)
            {
                result += (char)objRandom.Next(startNumber, endNumber);
            }
            return result;
        }


        #region 从指定字符串中抽取指定长度的随机字符串
        /**/
        /// <summary>
        /// 从指定字符串中抽取指定长度的随机字符串
        /// </summary>
        /// <param name="source">源字符串</param>
        /// <param name="resultLength">待获取随机字符串长度</param>
        /// <returns></returns>
        #endregion
        private static string GetRandomString(string source, int resultLength)
        {
            var objRandom = new Random(GetNewSeed());
            string result = null;
            for (int i = 0; i < resultLength; i++)
            {
                result += source.Substring(objRandom.Next(0, source.Length), 1);
            }
            return result;
        }


        #region 获取指定长度随机的数字字符串
        /**/
        /// <summary>
        /// 获取指定长度随机的数字字符串
        /// </summary>
        /// <param name="resultLength">待获取随机字符串长度</param>
        /// <returns></returns>
        #endregion
        public static string GetRandomNumberString(int resultLength)
        {
            return GetRandomString(_NumberChar, resultLength);
        }


        #region 获取指定长度随机的字母字符串（包含大小写字母）
        /**/
        /// <summary>
        /// 获取指定长度随机的字母字符串（包含大小写字母）
        /// </summary>
        /// <param name="resultLength">待获取随机字符串长度</param>
        /// <returns></returns>
        #endregion
        public static string GetRandomLetterString(int resultLength)
        {
            return GetRandomString(_LowerChar + _UpperChar, resultLength);
        }


        #region 获取指定长度随机的字母＋数字混和字符串（包含大小写字母）
        /**/
        /// <summary>
        /// 获取指定长度随机的字母＋数字混和字符串（包含大小写字母）
        /// </summary>
        /// <param name="resultLength">待获取随机字符串长度</param>
        /// <returns></returns>
        #endregion
        public static string GetRandomMixString(int resultLength)
        {
            return GetRandomString(_LowerChar + _UpperChar + _NumberChar, resultLength);
        }

        #endregion 
    }
}
