﻿using UnityEngine;

namespace JLGames.RocketDriver.Games.RpgMaterial.Common
{
    public struct DataRandNum : IDataRandomable
    {
        internal readonly int m_Type;
        internal readonly int m_Id;
        internal int m_Min;
        internal int m_Max;

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

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

        /// <summary>
        /// Min Number
        /// 最小值
        /// </summary>
        public int Min => m_Min;

        /// <summary>
        /// Max Number
        /// 最大值
        /// </summary>
        public int Max => m_Max;

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

        public DataNum RandToDataNum()
        {
            var num = Random.Range(m_Min, m_Max + 1);
            return new DataNum(m_Type, m_Id, 0, num);
        }

        public DataOffset RandToDataOffset(bool negative)
        {
            var num = Random.Range(m_Min, m_Max + 1);
            if (negative) num = -num;
            return new DataOffset(m_Type, m_Id, 0, num);
        }

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

        public DataRandNum(int type, int id, int min, int max)
        {
            m_Type = type;
            m_Id = id;
            m_Min = min;
            m_Max = max;
        }

        // static

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

        public static DataRandNum 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 min = int.Parse(ss[2]);
            var max = int.Parse(ss[3]);
            return new DataRandNum(type, id, min, max);
        }

        public static DataRandNum[] 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 DataRandNum[cs.Length];
            for (var index = 0; index < cs.Length; index++)
            {
                rs[index] = FromString(cs[index], sepField);
            }

            return rs;
        }
    }
}