﻿using JLGames.RocketDriver.Actions.ExcelExporter;
using JLGames.RocketDriver.Games.RpgMaterial.Common;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Cfg.CfgTitle;

namespace JLGames.RocketDriver.Samples.RpgMaterialDemo.Service.Material
{
    public class ExtGiftbagDetail : ExtCfgTitle<CfgGiftbagDetail>
    {
        private DataOffset[] m_Fixeds;
        private DataRandNum[] m_RandNums;
        private DataRandWeight[] m_RandWeights;
        private GroupRandAvg[] m_GroupRandAvgs;
        private GroupRandWeight[] m_GroupRandWeights;

        public DataOffset[] Fixeds => (DataOffset[]) m_Fixeds?.Clone();
        public DataRandNum[] RandNums => (DataRandNum[]) m_RandNums?.Clone();
        public DataRandWeight[] RandWeights => (DataRandWeight[]) m_RandWeights?.Clone();
        public GroupRandAvg[] GroupRandAvgs => (GroupRandAvg[]) m_GroupRandAvgs?.Clone();
        public GroupRandWeight[] GroupRandWeights => (GroupRandWeight[]) m_GroupRandWeights?.Clone();

        public bool IsEmpty => string.IsNullOrEmpty(RawData.NumFixed) &&
                               string.IsNullOrEmpty(RawData.NumRand) && string.IsNullOrEmpty(RawData.WeightRand) &&
                               string.IsNullOrEmpty(RawData.GroupRand) && string.IsNullOrEmpty(RawData.GroupWeightRand);

        public DataOffset[] RandToDataOffsets()
        {
            if (IsEmpty) return null;
            var rs = new DataOffset[0];
            rs = rs.Append(m_Fixeds);
            rs = rs.Append(m_RandNums.RandToDataOffsets(false));
            rs = rs.Append(m_RandWeights.RandToDataOffsets(false));
            rs = rs.Append(m_GroupRandAvgs.RandToDataOffsets(false));
            rs = rs.Append(m_GroupRandWeights.RandToDataOffsets(false));
            return rs.Merged();
        }

        public DataNum[] RandToDataNums()
        {
            if (IsEmpty) return null;
            var rs = new DataNum[0];
            rs = rs.Append(m_Fixeds.ToNumData());
            rs = rs.Append(m_RandNums.RandToDataNums());
            rs = rs.Append(m_RandWeights.RandToDataNums());
            rs = rs.Append(m_GroupRandAvgs.RandToDataNums());
            rs = rs.Append(m_GroupRandWeights.RandToDataNums());
            return rs.Merged();
        }

        protected override void HandleData()
        {
            m_Fixeds = DataOffset.ArrayFromString(RawData.NumFixed);
            m_RandNums = DataRandNum.ArrayFromString(RawData.NumRand);
            m_RandWeights = DataRandWeight.ArrayFromString(RawData.WeightRand);
            m_GroupRandAvgs = GroupRandAvg.ArrayFromString(RawData.GroupRand);
            m_GroupRandWeights = GroupRandWeight.ArrayFromString(RawData.GroupWeightRand);
        }
    }
}