﻿using JLGames.RocketDriver.CSharp.Service;
using JLGames.RocketDriver.Games.Service.DataConfig;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Cfg.CfgConst;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Service.Material;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Service.MaterialExtend.Exchange;

namespace JLGames.RocketDriver.Samples.RpgMaterialDemo.Service
{
    public static class ServiceCenter
    {
        public static IConfigDataService ConfigDataService => GetService<IConfigDataService>(ServiceNames.ConfigData);

        public static IMaterialResourceService MaterialResourceService => GetMaterialService<IMaterialResourceService>(ConstMaterialType.Resource);
        public static IMaterialItemService MaterialItemService => GetMaterialService<IMaterialItemService>(ConstMaterialType.Item);
        public static IMaterialGiftbagService MaterialGiftbagService => GetMaterialService<IMaterialGiftbagService>(ConstMaterialType.Giftbag);

        public static IExchangeService ExchangeService => GetService<IExchangeService>(ServiceNames.Exchange);

        //---------------------------------------------------

        /// <summary>
        /// Get the Service instance of the specified type of material
        /// 取得指定类型材料的Service实例
        /// </summary>
        /// <param name="materialType"></param>
        /// <returns></returns>
        public static IGameMaterialService GetMaterialService(int materialType)
        {
            var name = ServiceRegister.GetMaterialServiceName(materialType);
            return GetService(name) as IGameMaterialService;
        }

        /// <summary>
        /// Get the Service instance of the specified type of material
        /// 取得指定类型材料的Service实例
        /// </summary>
        /// <param name="materialType"></param>
        /// <typeparam name="T">转换为指定接口</typeparam>
        /// <returns></returns>
        public static T GetMaterialService<T>(int materialType) where T : IGameMaterialService
        {
            var service = GetMaterialService(materialType);
            if (service is T)
            {
                return (T) service;
            }

            return default(T);
        }

        /// <summary>
        /// Get Service instance through ServiceName
        /// 通过ServiceName取得Service实例
        /// </summary>
        /// <param name="serviceNamed"></param>
        /// <returns></returns>
        public static object GetService(string serviceNamed)
        {
            return ServiceConfig.Shared.GetServiceImpl(serviceNamed);
        }

        /// <summary>
        /// Get Service instance through ServiceName
        /// 通过ServiceName取得Service实例
        /// </summary>
        /// <param name="named"></param>
        /// <typeparam name="T">转换为指定接口</typeparam>
        /// <returns></returns>
        public static T GetService<T>(string named)
        {
            var service = GetService(named);
            if (service is T)
            {
                return (T) service;
            }

            return (T) (object) null;
        }

        //Static

        public static ServiceManager Manager => ServiceManager.Shared;

        public static void InitRegister()
        {
        }
        
        static ServiceCenter()
        {
            ServiceRegister.RegisterServices();
        }
    }
}