﻿using JLGames.RocketDriver.Games.RpgMaterial.Common;
using JLGames.RocketDriver.Games.RpgMaterial.Material;
using JLGames.RocketDriver.Samples.ServiceDemo.Cfg.CfgTitle;

namespace JLGames.RocketDriver.Samples.ServiceDemo.Service.Material
{
    public class GameResource : Material<CfgMaterialResource>, IGameResource
    {
        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 => "icon";
        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, (int) data.IconId, data.Weight);
            m_OperData = new MetaOper(data.OperMark);
        }
    }
}