using System;
using System.Collections.Generic;
using System.Linq;
namespace Masuit.Tools.Strings
{
    /// 
    /// 数制格式化器
    /// 
    public class NumberFormater
    {
        /// 
        /// 数制表示字符集
        /// 
        private string Characters { get; set; }
        /// 
        /// 进制长度
        /// 
        public int Length => Characters?.Length ?? 0;
        /// 
        /// 数制格式化器
        /// 
        public NumberFormater()
        {
            Characters = "0123456789";
        }
        /// 
        /// 数制格式化器
        /// 
        /// 进制转换
        public NumberFormater(string characters)
        {
            Characters = characters;
        }
        /// 
        /// 数制格式化器
        /// 
        /// 进制
        public NumberFormater(int bin)
        {
            if (bin < 2)
            {
                bin = 2;
            }
            if (bin > 62)
            {
                throw new ArgumentException("进制最大支持62进制");
            }
            Characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring(0, bin);
        }
        /// 
        /// 数字转换为指定的进制形式字符串
        /// 
        /// 
        /// 
        public string ToString(long number)
        {
            List result = new List();
            long t = number;
            while (t > 0)
            {
                var mod = t % Length;
                t = Math.Abs(t / Length);
                var character = Characters[Convert.ToInt32(mod)].ToString();
                result.Insert(0, character);
            }
            return string.Join("", result.ToArray());
        }
        /// 
        /// 指定字符串转换为指定进制的数字形式
        /// 
        /// 
        /// 
        public long FromString(string str)
        {
            long result = 0;
            int j = 0;
            foreach (var ch in new string(str.ToCharArray().Reverse().ToArray()))
            {
                if (Characters.Contains(ch))
                {
                    result += Characters.IndexOf(ch) * (long)Math.Pow(Length, j);
                    j++;
                }
            }
            return result;
        }
        /// Returns a string that represents the current object.
        /// A string that represents the current object.
        public override string ToString()
        {
            return Length + "模式";
        }
    }
}