
#pragma once

#include "LuprexK2Node.h"

#include "LuaCallNode.generated.h"

class FBlueprintActionDatabaseRegistrar;
class FString;
class UEdGraph;
class UObject;


//
// The Lua Call K2Node.
//
UCLASS(MinimalAPI)
class UK2Node_LuaInvoke : public UlxK2Node
{
	GENERATED_BODY()

public:
	//~ Begin UEdGraphNode Interface.
	virtual void AllocateDefaultPins() override;
	virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override;
	virtual bool ShouldShowNodeProperties() const override { return true; }
	virtual void PinDefaultValueChanged(UEdGraphPin* Pin) override;
	virtual FText GetTooltipText() const override;
	virtual FText GetPinDisplayName(const UEdGraphPin* Pin) const override;
	//~ End UEdGraphNode Interface.

	//~ Begin UK2Node Interface.
	virtual bool IsNodePure() const override { return false; }
	virtual void ReconstructNode() override;
	virtual bool NodeCausesStructuralBlueprintChange() const override { return true; }
	virtual void ExpandNode(class FKismetCompilerContext& CompilerContext, UEdGraph* SourceGraph) override;
	virtual ERedirectType DoPinsMatchForReconstruction(const UEdGraphPin* NewPin, int32 NewPinIndex, const UEdGraphPin* OldPin, int32 OldPinIndex) const override;
	virtual bool IsConnectionDisallowed(const UEdGraphPin* MyPin, const UEdGraphPin* OtherPin, FString& OutReason) const override;
	virtual void GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const override;
	virtual FText GetMenuCategory() const override;
	virtual int32 GetNodeRefreshPriority() const override { return EBaseNodeRefreshPriority::Low_UsesDependentWildcard; }
	//~ End UK2Node Interface.

private:

	virtual bool IsInvoke() const { return true; }

	/** Pin Names for the three built-in Pins **/
	static const FName FunctionPinName;
	static const FName PlacePinName;
	static const FName ExtraResultsPinName;
	static const FName ErrorPinName;

private:
	// Whenever the function value changes, we call
	// ReconstructNode, which backs up the value into this
	// property.  This cache is needed because during
	// ReconstructNode, we blow away the function pin.  The
	// function pin is also absent when the node is first
	// created.
	//
	UPROPERTY()
	FString LuaFunctionPrototype = TEXT("class.func(int arg1, int arg2) : int ret1, int ret2");

};

UCLASS(MinimalAPI)
class UK2Node_LuaProbe : public UK2Node_LuaInvoke
{
	GENERATED_BODY()

	// Setting this flag alters the behavior of LuaInvoke, making it
	// probe instead of invoke.
	//
	virtual bool IsInvoke() const override { return false; }
};

