﻿using UnityEngine;

namespace JLGames.RocketDriver.Games.RpgMaterial.Common
{
    public struct GroupRandAvg : IDataRandomable
    {
        private readonly DataNum[] m_Rands;

        public bool IsNone => null == m_Rands || m_Rands.Length == 0;

        public GroupRandAvg(DataNum[] rands)
        {
            m_Rands = rands;
        }

        public DataNum RandToDataNum()
        {
            return m_Rands[RandIndex()];
        }

        public DataOffset RandToDataOffset(bool negative)
        {
            return m_Rands[RandIndex()].ToOffsetData(negative);
        }

        public int RandIndex()
        {
            return Random.Range(0, m_Rands.Length);
        }

        // static

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

        public static GroupRandAvg FromString(string content, char sepEntity = SepEntity, char sepField = SepField)
        {
            if (string.IsNullOrEmpty(content)) return m_None;

            var rands = DataNum.ArrayFromString(content, sepEntity, sepField);
            return new GroupRandAvg(rands);
        }

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

            return rs;
        }
    }
}