using UnityEngine;
using System;
using System.Linq;

public static class IntExtensions {

    public static int RandomPlusMinus(){
        return UnityEngine.Random.Range(0, 2) * 2 - 1;
    }
    public static int RandomChooseRatio(params int[] ratioArray){
        return RandomChooseRatio(new System.Random(), ratioArray);
    }
    public static int RandomChooseRatio(System.Random rand, params int[] ratioArray){
        var totalRatio = ratioArray.Sum();
        var value = rand.Next(1, totalRatio + 1);
        var result = -1;
        for(var i = 0; i < ratioArray.Length; ++i){
            if(value <= ratioArray[i]){
                result = i;
                break;
            }
            value -= ratioArray[i];
        }
        return result;
    }

    public static int PickUp(this int value, int i){
        switch(i){
        case 0:
            return 0;
        case 1:
            return value % 10;
        default:
            return (value / (int)Math.Pow(10, i - 1)) % 10;
        }
    }

    public static string ToStringWithDigitCommas(this int value){
        return string.Format("{0:#,0}", value);
    }

    public static string ToTimeString(this int value){
        int minute = value / 60;
        int second = value % 60;
        return string.Format ("{0:D2}:{1:D2}", minute, second);
    }
    /// 負数未対応
    public static string ToChineseNumerals(this int number){
        return ((long)number).ToChineseNumerals();
    }
    public static string ToChineseNumerals(this long number){
        if(number < 0) return number.ToString();
        if(number == 0) return "〇";

        string[] digit = new string[] { "", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
        string[] subUnit = new string[] { "", "十", "百", "千" };
        string[] unit = new string[] { "", "万", "億", "兆", "京" };
        string str = "";
        int keta = 0;
        while(number > 0){
            int k = keta % 4;
            int n = (int)(number % 10);

            if(k == 0 && number % 10000 > 0){
                str = unit[keta / 4] + str;
            }

            if(k != 0 && n == 1){
                str = subUnit[k] + str;
            }else if(n != 0){
                str = digit[n] + subUnit[k] + str;
            }

            ++keta;
            number /= 10;
        }
        return str;
    }

    public static string ToMetricPrefix(this ulong value, int decimalPoint = 1){
        string str = string.Format("{0:#,0}", value);
        if(str.Length < 4) return str;
        string result = str.Substring(0, str.IndexOf(',') + 2).Replace(',', '.');
        string[] unit = new string[] { "", "k", "M", "G", "T", "P", "E", "Z", "Y" };
        result = string.Format("{0}{1}", result, unit[Mathf.Min(str.Count(c => c == ','), unit.Length - 1)]);
        return result;
    }
}
