﻿using JLGames.RocketDriver.Games.RpgMaterial.Common;
using JLGames.RocketDriver.Games.RpgMaterial.Material;

namespace JLGames.RocketDriver.Games.RpgMaterial.User
{
    public abstract class UserMaterialValid<TM, TCfg> : IUserMaterialValidMod, IUserMaterialValid<TM, TCfg>
        where TM : IMaterialValid<TCfg>
    {
        protected IUserValidData m_Data;

        public string EKey => $"{MId}_{UId}";
        public int Type => m_Data.Type;
        public int MId => m_Data.Id;
        public int UId => m_Data.UId;
        public int Num => m_Data.Num;
        public string Name => Material.Name;
        public abstract TM Material { get; }

        public override string ToString()
        {
            return $"UserMaterialValid[EKey={EKey}, Data={m_Data}, Material={Material}]";
        }

        // IUserMaterialValid

        public bool ValidEnabled => Material.ValidEnabled;
        public MaterialValidType ValidType => Material.ValidType;
        public long Gainstamp => m_Data.Gainstamp;

        public bool CheckValid(long ticks)
        {
            return Material.CheckValid(ticks);
        }

        // IUserMaterialMod

        public void SetType(int type)
        {
            m_Data.SetType(type);
        }

        public void SetMId(int mId)
        {
            m_Data.SetId(mId);
        }

        public void SetUId(int uId)
        {
            m_Data.SetUId(uId);
        }

        public void SetNum(int num)
        {
            m_Data.SetNum(num);
        }

        public void UpdateNum(DataNum num)
        {
            m_Data.SetNum(num.Num);
        }

        public void UpdateNum(DataOffset offset)
        {
            m_Data.SetNum(m_Data.Num + offset.Offset);
        }

        public abstract void UpdateData(object data);

        // IUserMaterialValidMod

        public void SetGainstamp(long gainstamp)
        {
            m_Data.SetGainstamp(gainstamp);
        }
    }
}