﻿using JLGames.RocketDriver.Games.RpgMaterial.Common;
using JLGames.RocketDriver.Games.RpgMaterial.Material;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Cfg.CfgTitle;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Global.Const;

namespace JLGames.RocketDriver.Samples.RpgMaterialDemo.Service.Material
{
    public class MaterialResource : Material<CfgMaterialResource>, IMaterialResource
    {
        protected MetaWorth m_WorthData;
        protected MetaDisplay m_DisplayData;
        protected MetaOper m_OperData;

        // IMaterialWorth

        public int Worth => m_WorthData.Worth;
        public int Quality => m_DisplayData.Quality;

        public int GetNumByWorth(int worth, bool ceil)
        {
            return m_WorthData.GetNumByWorth(worth, ceil);
        }

        public int GetWorthByNum(int num)
        {
            return m_WorthData.GetWorthByNum(num);
        }

        // IMaterialDisplay

        public int IconId => m_DisplayData.IconId == 0 ? m_Data.Id : m_DisplayData.IconId;
        public string IconBundleName => AssetBundles.BundleIcon;
        public string IconPath => GameMaterialPathUtils.GetIconPath(m_Data.Type);
        public string IconSubName => GameMaterialPathUtils.GetIconSubName(m_Data.Type, IconId);
        public int Weight => m_DisplayData.Weight;

        // IMaterialOper

        public bool CheckOperability(int index)
        {
            return m_OperData.CheckOperability(index);
        }

        // IInitMaterial<TCfg>

        public void InitMaterial(CfgMaterialResource data)
        {
            m_RawData = data;
            m_Data = new MetaData((int) data.Id, data.Name, data.Type, (int) data.Limit[0], (int) data.Limit[1],
                data.Desc);
            m_WorthData = new MetaWorth(data.Worth);
            m_DisplayData = new MetaDisplay(data.Quality, data.IconId, data.Weight);
            m_OperData = new MetaOper(data.OperMark);
        }
    }
}