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

#pragma once

#include <memory>
#include <string>
#include "ISCW_FEdGraphTerminalType.h"
#include "ISCW_FSimpleMemberReference.h"
#include "ISCW_UObject.h"

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

namespace Sourcify
{	
	enum class SCW_EPinContainerType : uint8_t
	{
		None,
		Array,
		Set,
		Map,
	};

	class ISCW_FEdGraphPinType
	{
	public:
		virtual ~ISCW_FEdGraphPinType() = default;

		virtual SCW_EPinContainerType GetContainerType() const = 0;

		virtual wstring GetPinCategory() const = 0;
		
		virtual wstring GetPinSubCategory() const = 0;

		virtual ISCW_UObjectPtr GetPinSubCategoryObject() const = 0;

		virtual ISCW_FSimpleMemberReferencePtr GetPinSubCategoryMemberReference() const = 0;
		
		virtual ISCW_FEdGraphTerminalTypePtr GetPinValueType() const = 0;

		virtual bool IsWeakPointer() const = 0;

		virtual void MakeReadOnlyCopy() = 0;

		virtual void SetPinCategory(const wstring& InCategory) const = 0;
		
		virtual void SetPinSubCategory(const wstring& InSubCategory) const = 0;

		virtual void SetPinSubCategoryObject(ISCW_UObjectPtr InObjectPtr) const = 0;

		virtual shared_ptr<ISCW_FEdGraphPinType> ToFEdGraphPinTypePtr() = 0;
		virtual shared_ptr<const ISCW_FEdGraphPinType> ToFEdGraphPinTypePtr() const = 0;
	};

	using ISCW_FEdGraphPinTypeConstPtr = shared_ptr<const ISCW_FEdGraphPinType>;
	using ISCW_FEdGraphPinTypePtr = shared_ptr<ISCW_FEdGraphPinType>;
} // namespace Sourcify