using System.Net;
using System.Net.Sockets;

namespace ET.Server
{
    public static class SceneFactory
    {
        public static async ETTask<Scene> CreateServerScene(Entity parent, long id, long instanceId, int zone, string name, SceneType sceneType, StartSceneConfig startSceneConfig = null)
        {
            await ETTask.CompletedTask;
            Scene scene = EntitySceneFactory.CreateScene(id, instanceId, zone, sceneType, name, parent);

            scene.AddComponent<MailBoxComponent, MailboxType>(MailboxType.UnOrderMessageDispatcher);

            switch (scene.SceneType)
            {
                case SceneType.Router:
                    // 云服务器中,一般来说router要单独部署,不过大家经常放在一起,那么下面要修改
                    // startSceneConfig.OuterIPPort改成startSceneConfig.InnerIPOutPort
                    // 然后云服务器防火墙把端口映射过来
                    scene.AddComponent<RouterComponent, IPEndPoint, string, NetworkProtocol>(
                        startSceneConfig.InnerIPOutPort,
                        startSceneConfig.StartProcessConfig.InnerIP,
                        NetworkProtocol.TCP
                    );
                    break;
                case SceneType.RouterManager: // 正式发布请用CDN代替RouterManager
                    // 云服务器在防火墙那里做端口映射
                    scene.AddComponent<HttpComponent, string>($"http://+:{startSceneConfig.OuterPort}/");
                    break;
                case SceneType.Realm:
                    scene.AddComponent<NetServerComponent, IPEndPoint, NetworkProtocol>(startSceneConfig.InnerIPOutPort, NetworkProtocol.KCP);
                    scene.AddComponent<UserSessionComponent>();
                    break;
                case SceneType.Game:
                    ConstGame.GameServerId = startSceneConfig.Id;
                    ConstGame.GameServerUUID = System.Guid.NewGuid().ToString();

                    scene.AddComponent<NetServerComponent, IPEndPoint, NetworkProtocol>(startSceneConfig.InnerIPOutPort, NetworkProtocol.KCP);
                    scene.AddComponent<GameTokenInfoComponent>();
                    scene.AddComponent<GamePlayerComponent>();
                    scene.AddComponent<GameMapComponent>();
                    // 抖音组件
                    scene.AddComponent<GameDouyinComponent>();
                    // 战斗服的Ice会话组件
                    scene.AddComponent<BattleIceAgentComponent>();
                    scene.AddComponent<ObjectWait>();
                    break;
                case SceneType.Location:
                    scene.AddComponent<LocationComponent>();
                    break;
                case SceneType.Robot:
                    scene.AddComponent<RobotManagerComponent>();
                    break;
                case SceneType.BenchmarkServer:
                    scene.AddComponent<BenchmarkServerComponent>();
                    scene.AddComponent<NetServerComponent, IPEndPoint, NetworkProtocol>(startSceneConfig.InnerIPOutPort, NetworkProtocol.KCP);
                    break;
                case SceneType.BenchmarkClient:
                    scene.AddComponent<BenchmarkClientComponent>();
                    break;
            }

            return scene;
        }
    }
}