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

#pragma once

#include "ISCW_UObject.h"
#include <map>
#include <string>
#include <vector>

using std::map;
using std::vector;
using std::wstring;

namespace Sourcify
{
	/*
	 * For internal use by the DependencyNode struct
	 */
	class IConversionContextManager
	{
	public:
		virtual ~IConversionContextManager() = default;
		
		enum class NameConflictType : uint8_t
		{
			None = 0,
			OtherType,
			Member,
			OtherTypeAndMember
		};
		
		enum class MemberConflictType : uint8_t
		{
			None = 0,
			Component,
			DelegateBind,
			Enumerator,
			Function,
			FunctionParameter,
			ImplementedInterface,
			OtherType,
			Property
		};
		
		virtual NameConflictType CheckForNameConflicts(const ISCW_UObject& InObject, const wstring& InObjectName, map<MemberConflictType, vector<wstring>>& Conflicts) const = 0;
		virtual ISCW_UObjectConstPtr HeaderContainsConflictingStructDependency(const wstring& InHeaderPath, const ISCW_UObject& InObject) const = 0;
		virtual wstring MemberConflictTypeToString(MemberConflictType MemberConflictType, bool Plural = false) const = 0;
		virtual wstring GetParentClassError(const ISCW_UObject& Object) const = 0;

	protected:
		IConversionContextManager() = default;
	};
}