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

namespace JLGames.RocketDriver.Games.RpgMaterial.User
{
    public abstract class UserMaterialWorth<TM, TCfg> : IUserMaterialMod, IUserMaterialWorth<TM, TCfg>
        where TM : IMaterialWorth<TCfg>
    {
        protected IUserData 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 $"UserMaterialWorth[EKey={EKey}, Data={m_Data}, Material={Material}]";
        }

        // IUserMaterialWorth

        public int Worth => Material.GetWorthByNum(m_Data.Num);

        // 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);
    }
}