﻿using System;
using System.Collections.Generic;
using JLGames.RocketDriver.CSharp.Service;
using JLGames.RocketDriver.Samples.ServiceDemo.Cfg.CfgConst;
using JLGames.RocketDriver.Samples.ServiceDemo.Preload;
using JLGames.RocketDriver.Samples.ServiceDemo.Service.ConfigData;
using JLGames.RocketDriver.Samples.ServiceDemo.Service.Demo;
using JLGames.RocketDriver.Samples.ServiceDemo.Service.Material;

namespace JLGames.RocketDriver.Samples.ServiceDemo.Service
{
    internal static class ServiceRegister
    {
        private static readonly List<int> m_MaterialTypes = new List<int>();

        /// <summary>
        /// 取全部材料类型
        /// </summary>
        public static int[] RegisteredMaterialTypes => m_MaterialTypes.ToArray();

        /// <summary>
        /// 检查材料类型是否存在
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static bool CheckMaterialExist(int type)
        {
            return m_MaterialTypes.Contains(type);
        }

        internal static void RegisterServices()
        {
            m_MaterialTypes.Clear();
            RegisterInfraServices();
            RegisterBusinessConfigs();
            RegisterPostConfigs();
        }

        private static void RegisterInfraServices()
        {
            RegisterService(ServiceNames.ConfigData, new ConfigDataService());
            RegisterService(ServiceNames.Preload, new PreloadService());
        }

        private static void RegisterBusinessConfigs()
        {
            RegisterMaterialService(ConstMaterialType.Resource, new ResourceService());

            RegisterService(ServiceNames.DemoService1, new DemoService(), 0f, 0f);
            RegisterService(ServiceNames.DemoService2, new DemoService(), 1.5f, 0f);
            RegisterService(ServiceNames.DemoService3, new DemoService(), 1.5f, 2f);
            RegisterService(ServiceNames.DemoService4, new DemoService(), 2f, 1.5f);
        }

        private static void RegisterPostConfigs()
        {
            var shared = ServiceConfig.Shared;
        }

        private static void RegisterService(string serviceName, IService serviceImpl, params object[] args)
        {
            ServiceConfig.Shared.AddConfig(new ServiceInfo(serviceName, serviceImpl, args));
        }

        private static void RegisterMaterialService(int materialType, IService serviceImpl, params object[] args)
        {
            if (m_MaterialTypes.Contains(materialType)) throw new Exception($"Repeat registration at {materialType}!");
            m_MaterialTypes.Add(materialType);
            RegisterService(GetMaterialServiceName(materialType), serviceImpl, args);
        }

        internal static string GetMaterialServiceName(int materialType)
        {
            return $"ServiceNames.Material_{materialType}";
        }
    }
}