﻿using JLGames.RocketDriver.CSharp.Service;
using JLGames.RocketDriver.Games.Service.DataConfig;
using JLGames.RocketDriver.Games.Service.Preload;
using JLGames.RocketDriver.Samples.ServiceDemo.Cfg.CfgConst;
using JLGames.RocketDriver.Samples.ServiceDemo.Service.Demo;
using JLGames.RocketDriver.Samples.ServiceDemo.Service.Material;
using IResourceService = JLGames.RocketDriver.Samples.ServiceDemo.Service.Material.IResourceService;

namespace JLGames.RocketDriver.Samples.ServiceDemo.Service
{
    public static class ServiceCenter
    {
        public static IConfigDataService ConfigDataService => GetService<IConfigDataService>(ServiceNames.ConfigData);
        public static IPreloadService PreloadService => GetService<IPreloadService>(ServiceNames.Preload);
        public static Material.IResourceService ResourceService => GetMaterialService<Material.IResourceService>(ConstMaterialType.Resource);
        public static IDemoService DemoService1 => GetService<IDemoService>(ServiceNames.DemoService1);
        public static IDemoService DemoService2 => GetService<IDemoService>(ServiceNames.DemoService2);
        public static IDemoService DemoService3 => GetService<IDemoService>(ServiceNames.DemoService3);
        public static IDemoService DemoService4 => GetService<IDemoService>(ServiceNames.DemoService4);

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

        /// <summary>
        /// 取得指定类型材料的Service实例
        /// </summary>
        /// <param name="materialType"></param>
        /// <returns></returns>
        public static IGameMaterialService GetMaterialService(int materialType)
        {
            var name = $"ServiceNames.Material_{materialType}";
            return GetService(name) as IGameMaterialService;
        }

        /// <summary>
        /// 取得指定类型材料的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>
        /// 通过ServiceName取得Service实例
        /// </summary>
        /// <param name="serviceNamed"></param>
        /// <returns></returns>
        public static object GetService(string serviceNamed)
        {
            return ServiceConfig.Shared.GetServiceImpl(serviceNamed);
        }

        /// <summary>
        /// 通过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()
        {
            ServiceRegister.RegisterServices();
        }
    }
}