// Copyright (c) 2024 Codemongous LLC. All Rights Reserved.

#pragma once

#include "ISCW_AActor.h"
#include "ISCW_UClass.h"
#include "ISCW_UObject.h"

#include <memory>
#include <string>
#include <vector>

using std::shared_ptr;
using std::vector;
using std::wstring;

namespace Sourcify
{
	class ISCW_ULevel;
	class ISCW_UWorld : public virtual ISCW_UObject
	{
	public:
		virtual ~ISCW_UWorld() = default;

		virtual void DestroyWorld(bool bInformEngineOfWorld, shared_ptr<ISCW_UWorld> NewWorld = nullptr ) const = 0;
		
		virtual ISCW_AActorPtr SpawnActor_AActor(ISCW_UClassPtr ActorClass) = 0;

		virtual shared_ptr<ISCW_ULevel> GetPersistentLevel() const = 0;

		virtual vector<shared_ptr<ISCW_AActor>> GetActors(ISCW_UClassPtr ActorClass = nullptr) const = 0;
		
		virtual shared_ptr<ISCW_UWorld> ToUWorldPtr() = 0;
		virtual shared_ptr<const ISCW_UWorld> ToUWorldPtr() const = 0;
	};

	using ISCW_UWorldConstPtr = shared_ptr<const ISCW_UWorld>;
	using ISCW_UWorldPtr = shared_ptr<ISCW_UWorld>;
} // namespace Sourcify