﻿using UnityEngine;

namespace JLGames.RocketDriver.Games.RpgMaterial.Common
{
    public struct DataRandWeight : IDataRandomable
    {
        private const int RandMin = 0;
        private const int RandMax = 10000;
        internal readonly int m_Type;
        internal readonly int m_Id;
        internal int m_Num;
        internal int m_Weight4;

        /// <summary>
        /// Type
        /// 类型
        /// </summary>
        public int Type => m_Type;

        /// <summary>
        /// Id
        /// </summary>
        public int Id => m_Id;

        /// <summary>
        /// Number
        /// 数量
        /// </summary>
        public int Num => m_Num;

        /// <summary>
        /// Probability, ten thousand points
        /// 万分权重
        /// </summary>
        public int Weight => m_Weight4;

        /// <summary>
        /// Check for empty data
        /// 检测是否为空数据
        /// </summary>
        public bool IsNone => m_Id == 0 || m_Type == 0 || m_Num == 0 || m_Weight4 == 0;

        public override string ToString()
        {
            return $"Num{{Id={Id},Type={Type},Num={Num},Weight={Weight}}}";
        }

        public DataRandWeight(int type, int id, int num, int weight4)
        {
            m_Type = type;
            m_Id = id;
            m_Num = num;
            m_Weight4 = weight4;
        }

        public DataNum ToDataNum()
        {
            return new DataNum(m_Type, m_Id, 0, m_Num);
        }

        public DataOffset ToDataOffset(bool negative)
        {
            return new DataOffset(m_Type, m_Id, 0, (negative ? -Num : Num));
        }

        public DataNum RandToDataNum()
        {
            return new DataNum(m_Type, m_Id, 0, CheckHit() ? Num : 0);
        }

        public DataOffset RandToDataOffset(bool negative)
        {
            return new DataOffset(m_Type, m_Id, 0, CheckHit() ? (negative ? -Num : Num) : 0);
        }

        public bool CheckHit()
        {
            return Random.Range(RandMin, RandMax) < m_Weight4;
        }

        // static

        private const char SepField = ':';
        private const char SepEntity = '&';
        private static readonly DataRandWeight m_None = new DataRandWeight();

        public static DataRandWeight FromString(string content, char sepField = SepField)
        {
            if (string.IsNullOrEmpty(content)) return m_None;
            var ss = content.Split(sepField);
            var type = int.Parse(ss[0]);
            var id = int.Parse(ss[1]);
            var num = int.Parse(ss[2]);
            var weight = int.Parse(ss[3]);
            return new DataRandWeight(type, id, num, weight);
        }

        public static DataRandWeight[] ArrayFromString(string content, char sepEntity = SepEntity, char sepField = SepField)
        {
            if (string.IsNullOrEmpty(content)) return null;
            var cs = content.Split(sepEntity);
            if (cs.Length == 0) return null;
            var rs = new DataRandWeight[cs.Length];
            for (var index = 0; index < cs.Length; index++)
            {
                rs[index] = FromString(cs[index], sepField);
            }

            return rs;
        }
    }
}