using SqlSugar;
using System.Data;
using System.Text;

namespace DS.Module.Core;

/// <summary>
/// 编码帮助类
/// </summary>
public class NumUtil
{
    #region 自动生成日期编号

    /// <summary>
    /// 自动生成编号  201008251145409865
    /// </summary>
    /// <returns></returns>
    public static string CreateNo()
    {
        Random random = new Random();
        string strRandom = random.Next(1000, 10000).ToString(); //生成编号
        string code = DateTime.Now.ToString("yyyyMMddHHmmss") + strRandom; //形如
        return code;
    }

    #endregion 自动生成日期编号

    #region 生成随机推荐码

    /// <summary>
    /// 生成随机数的种子
    /// </summary>
    /// <returns></returns>
    private static int getNewSeed()
    {
        byte[] rndBytes = new byte[4];
        System.Security.Cryptography.RNGCryptoServiceProvider rng =
            new System.Security.Cryptography.RNGCryptoServiceProvider();
        rng.GetBytes(rndBytes);
        return BitConverter.ToInt32(rndBytes, 0);
    }

    #endregion 生成随机推荐码

    /// <summary>
    /// 生成随机数
    /// </summary>
    /// <param name="length">位数</param>
    /// <returns></returns>
    public static string GetRandomString(int len)
    {
        string s = "123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";
        string reValue = string.Empty;
        Random rnd = new Random(getNewSeed());
        while (reValue.Length < len)
        {
            string s1 = s[rnd.Next(0, s.Length)].ToString();
            if (reValue.IndexOf(s1) == -1) reValue += s1;
        }

        return reValue;
    }

    /// <summary>
    /// 生成单据编号
    /// </summary>
    /// <param name="db">数据库db</param>
    /// <param name="prefix">前缀</param>
    /// <returns></returns>
    public static string GetBillNo(ISqlSugarClient db, string prefix)
    {
        var ps_BillType = new SugarParameter("@ps_BillType", prefix);
        var ps_OrgCode = new SugarParameter("@ps_OrgCode", "Comcab2d43f60454327af30a131fc1d3abd");
        var ps_EmpCode = new SugarParameter("@ps_EmpCode", "1BEC90E1-9780-472F-90C2-0C6390C044A4");
        var ps_Date = new SugarParameter("@ps_Date", DateTime.Now.AddDays(0).ToString("yyyy-MM-dd"));
        var ps_bshead = new SugarParameter("@ps_bshead", "");
        var ps_BillNo = new SugarParameter("@ps_BillNo", "");
        var ps_RefBillNo = new SugarParameter("@ps_RefBillNo", "");
        var dt = db.Ado.UseStoredProcedure().GetDataTable("sSysGetBillNo_new", ps_BillType, ps_OrgCode, ps_EmpCode,
            ps_Date, ps_bshead, ps_BillNo, ps_RefBillNo) as DataTable; //返回dt
        //Console.WriteLine(dt.Rows[0].ItemArray[0]);
        // return dt?[0]["BillNo"].ToString();
        return dt.Rows[0].ItemArray[0].ToString();
    }

    public static string GetNo()
    {
        string No = ""; //生成编号
        DateTime now = DateTime.Now;
        string Year = now.Year.ToString().Substring(2, 2);
        string Month = now.Month < 10 ? "0" + now.Month : now.Month.ToString();
        string Day = now.Day < 10 ? "0" + now.Day : now.Day.ToString();
        string Hour = now.Hour < 10 ? "0" + now.Hour : now.Hour.ToString();
        string Minute = now.Minute < 10 ? "0" + now.Minute : now.Minute.ToString();
        string Second = now.Second < 10 ? "0" + now.Second : now.Second.ToString();
        string Millisecond = now.Millisecond < 10 ? "0" + now.Millisecond : now.Millisecond.ToString();
        Random rd = new Random();
        int a = rd.Next(0, 9);
        int b = rd.Next(0, 9);
        int c = rd.Next(0, 9);
        No = Year + Month + Day + Hour + Minute + Second + Millisecond + a + b + c;
        return No;
    }

    public static string GetShortNo()
    {
        string No = ""; //生成编号
        DateTime now = DateTime.Now;
        string Year = now.Year.ToString().Substring(2, 2);
        string Month = now.Month < 10 ? "0" + now.Month : now.Month.ToString();
        string Day = now.Day < 10 ? "0" + now.Day : now.Day.ToString();
        string Hour = now.Hour < 10 ? "0" + now.Hour : now.Hour.ToString();
        string Minute = now.Minute < 10 ? "0" + now.Minute : now.Minute.ToString();
        string Second = now.Second < 10 ? "0" + now.Second : now.Second.ToString();
        string Millisecond = now.Millisecond < 10 ? "0" + now.Millisecond : now.Millisecond.ToString();
        Random rd = new Random();
        int a = rd.Next(0, 9);
        int b = rd.Next(0, 9);
        int c = rd.Next(0, 9);
        No = Year + Month + Day + Hour + Minute + a + b + c;
        return No;
    }

    public static string GenerateRandomCode(int length)
    {
        var result = new StringBuilder();
        for (var i = 0; i < length; i++)
        {
            var r = new Random(Guid.NewGuid().GetHashCode());
            result.Append(r.Next(0, 10));
        }

        return result.ToString();
    }

    public static Guid GenerateGuid()
    {
        byte[] guidArray = Guid.NewGuid().ToByteArray();

        var baseDate = new DateTime(1900, 1, 1);
        DateTime now = DateTime.Now;
        var days = new TimeSpan(now.Ticks - baseDate.Ticks);
        TimeSpan msecs = now.TimeOfDay;

        byte[] daysArray = BitConverter.GetBytes(days.Days);
        byte[] msecsArray = BitConverter.GetBytes((long)(msecs.TotalMilliseconds / 3.333333));

        Array.Reverse(daysArray);
        Array.Reverse(msecsArray);

        Array.Copy(daysArray, daysArray.Length - 2, guidArray, guidArray.Length - 6, 2);
        Array.Copy(msecsArray, msecsArray.Length - 4, guidArray, guidArray.Length - 4, 4);

        return new Guid(guidArray);
    }

    /// <summary>
    /// 生成50位有序Guid
    /// </summary>
    /// <returns></returns>
    public static string GetSequentialGuid()
    {
        string guid = Guid.NewGuid().ToString();
        var timeStr = (DateTime.Now.Ticks / 10000).ToString("x8");
        var newGuid = $"{timeStr.PadLeft(13, '0')}-{guid}";
        return newGuid;
    }
}