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

#pragma once

#include "ISCW_UEdGraph.h"
#include "ISCW_UK2Node_CreateDelegate.h"
#include "ISCW_UK2Node_Event.h"
#include <memory>

using std::shared_ptr;

/*
*
* Unreal's FGraphNodeCreator is actually a template class, so we need to create all the versions of it that we use in Core
*
*/
	
namespace Sourcify
{	
	class ISCW_FGraphNodeCreator_UK2Node_Event
	{
	public:
		virtual ~ISCW_FGraphNodeCreator_UK2Node_Event() = default;

		virtual ISCW_UK2Node_EventPtr CreateNode(bool bSelectNewNode = true) = 0;

		virtual void Finalize() = 0;
		
		virtual shared_ptr<ISCW_FGraphNodeCreator_UK2Node_Event> ToFGraphNodeCreator_UK2Node_EventPtr() = 0;
		virtual shared_ptr<const ISCW_FGraphNodeCreator_UK2Node_Event> ToFGraphNodeCreator_UK2Node_EventPtr() const = 0;
	};

	using ISCW_FGraphNodeCreator_UK2Node_EventConstPtr = shared_ptr<const ISCW_FGraphNodeCreator_UK2Node_Event>;
	using ISCW_FGraphNodeCreator_UK2Node_EventPtr = shared_ptr<ISCW_FGraphNodeCreator_UK2Node_Event>;

	class ISCW_FGraphNodeCreator_UK2Node_CreateDelegate
	{
	public:
		virtual ~ISCW_FGraphNodeCreator_UK2Node_CreateDelegate() = default;
		
		virtual ISCW_UK2Node_CreateDelegatePtr CreateNode(bool bSelectNewNode = true) = 0;

		virtual void Finalize() = 0;
				
		virtual shared_ptr<ISCW_FGraphNodeCreator_UK2Node_CreateDelegate> ToFGraphNodeCreator_UK2Node_CreateDelegatePtr() = 0;
		virtual shared_ptr<const ISCW_FGraphNodeCreator_UK2Node_CreateDelegate> ToFGraphNodeCreator_UK2Node_CreateDelegatePtr() const = 0;
	};

	using ISCW_FGraphNodeCreator_UK2Node_CreateDelegateConstPtr = shared_ptr<const ISCW_FGraphNodeCreator_UK2Node_CreateDelegate>;
	using ISCW_FGraphNodeCreator_UK2Node_CreateDelegatePtr = shared_ptr<ISCW_FGraphNodeCreator_UK2Node_CreateDelegate>;
} // namespace Sourcify