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

#pragma once

#include "ISCW_FBPVariableDescription.h"
#include "ISCW_FProperty.h"
#include "ISCW_UClass.h"
#include "ISCW_UObject.h"
#include "ISCW_UStruct.h"
#include <memory>
#include <string>

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

namespace Sourcify
{	
	class ISCW_FMemberReference
	{
	public:
		virtual ~ISCW_FMemberReference() = default;

		virtual wstring GetMemberName() const = 0;

		virtual ISCW_UClassPtr GetMemberParentClass() const = 0;

		virtual wstring GetMemberScopeName() const = 0;

		virtual bool IsLocalScope() const = 0;

		virtual bool IsSelfContext() const = 0;
		
		virtual ISCW_FPropertyPtr ResolveMember_FProperty(ISCW_UClassPtr InClass) const = 0;

		virtual void SetDirect(const wstring InMemberName, /*const FGuid InMemberGuid, */ISCW_UClassPtr InMemberParentClass, bool bIsConsideredSelfContext) = 0;
		
		virtual void SetExternalMember(wstring InMemberName, ISCW_UClassPtr InMemberParentClass) = 0;

		virtual void SetLocalMember(wstring InMemberName, ISCW_UStructPtr InScope, const SCW_FGuid& InMemberGuid = {}) = 0;

		virtual void SetLocalMember(wstring InMemberName, const wstring& InScope, const SCW_FGuid& InMemberGuid = {}) = 0;

		virtual void SetMemberName(wstring InMemberName) = 0;

		virtual shared_ptr<ISCW_FMemberReference> ToFMemberReferencePtr() = 0;
		virtual shared_ptr<const ISCW_FMemberReference> ToFMemberReferencePtr() const = 0;
	};

	using ISCW_FMemberReferenceConstPtr = shared_ptr<const ISCW_FMemberReference>;
	using ISCW_FMemberReferencePtr = shared_ptr<ISCW_FMemberReference>;
} // namespace Sourcify