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

#pragma once
#include "ISCW_UEdGraphNode.h"
#include "ISCW_UK2Node_AddComponent.h"
#include "ISCW_UK2Node_AddDelegate.h"
#include "ISCW_UK2Node_AssignDelegate.h"
#include "ISCW_UK2Node_CallFunction.h"
#include "ISCW_UK2Node_ComponentBoundEvent.h"
#include "ISCW_UK2Node_CustomEvent.h"
#include "ISCW_UK2Node_Event.h"
#include "ISCW_UK2Node_FunctionEntry.h"
#include "ISCW_UK2Node_Variable.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_UEdGraph : public virtual ISCW_UObject
	{
	public:
		virtual ~ISCW_UEdGraph() = default;

		virtual shared_ptr<ISCW_UEdGraph> ToUEdGraphPtr() = 0;
		virtual shared_ptr<const ISCW_UEdGraph> ToUEdGraphPtr() const = 0;

		virtual void GetAllChildrenGraphs(vector<shared_ptr<ISCW_UEdGraph>>& OutGraphs) const = 0;

		virtual vector<ISCW_UEdGraphNodePtr> GetNodes() const = 0;

		virtual void GetNodesOfClass_UK2Node_AddComponent(vector<ISCW_UK2Node_AddComponentPtr>& OutNodes) const = 0;

		virtual void GetNodesOfClass_UK2Node_AddDelegate(vector<ISCW_UK2Node_AddDelegatePtr>& OutNodes) const = 0;
		
		virtual void GetNodesOfClass_UK2Node_AssignDelegate(vector<ISCW_UK2Node_AssignDelegatePtr>& OutNodes) const = 0;
		
		virtual void GetNodesOfClass_UK2Node_CallFunction(vector<ISCW_UK2Node_CallFunctionPtr>& OutNodes) const = 0;
		
		virtual void GetNodesOfClass_UK2Node_ComponentBoundEvent(vector<ISCW_UK2Node_ComponentBoundEventPtr>& OutNodes) const = 0;
		
		virtual void GetNodesOfClass_UK2Node_CustomEvent(vector<ISCW_UK2Node_CustomEventPtr>& OutNodes) const = 0;

		virtual void GetNodesOfClass_UK2Node_Event(vector<ISCW_UK2Node_EventPtr>& OutNodes) const = 0;

		virtual void GetNodesOfClass_UK2Node_FunctionEntry(vector<ISCW_UK2Node_FunctionEntryPtr>& OutNodes) const = 0;

		virtual void GetNodesOfClass_UK2Node_Variable(vector<ISCW_UK2Node_VariablePtr>& OutNodes) const = 0;

		virtual bool ContainsNode(shared_ptr<const ISCW_UEdGraphNode> Node) const = 0;

		virtual void InvalidateInterfaceGuid() const = 0;

		virtual void SetAllowDeletion(bool InAllowDeletion) const = 0;
	};

	using ISCW_UEdGraphConstPtr = shared_ptr<const ISCW_UEdGraph>;
	using ISCW_UEdGraphPtr = shared_ptr<ISCW_UEdGraph>;
} // namespace Sourcify