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

#pragma once
#include "ISCW_UActorComponent.h"
#include <memory>
#include "SCW_FTransform.h"
#include <string>

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

namespace Sourcify
{
	enum class SCW_EAttachmentTransformRules : uint8_t
	{
		KeepRelativeTransform,
		KeepWorldTransform,
		SnapToTargetNotIncludingScale,
		SnapToTargetIncludingScale
	};

	class ISCW_USceneComponent : public virtual ISCW_UActorComponent
	{
	public:
		virtual ~ISCW_USceneComponent() = default;

		// Note: Replaced FAttachmentTransformRules with SCW_EAttachmentTransformRules
		virtual bool AttachToComponent(shared_ptr<ISCW_USceneComponent> InParent, SCW_EAttachmentTransformRules AttachmentRules, wstring InSocketName = L"None" /*NAME_None*/) const = 0;

		virtual shared_ptr<ISCW_USceneComponent> GetAttachParent() const = 0;

		virtual wstring GetAttachSocketName() const = 0;

		virtual SCW_FTransform GetRelativeTransform() const = 0;

		static wstring GetRelativeScale3DPropertyName()	{ return L"RelativeScale3D"; }

		static wstring GetRelativeLocationPropertyName() { return L"RelativeLocation"; }

		static wstring GetRelativeRotationPropertyName() { return L"RelativeRotation"; }
	};

	using ISCW_USceneComponentConstPtr = shared_ptr<const ISCW_USceneComponent>;
	using ISCW_USceneComponentPtr = shared_ptr<ISCW_USceneComponent>;
} // namespace Sourcify