#pragma once
#include "GasaAbilitySystemComponent.h"
#include "AbilitySystemInterface.h"
#include "AbilitySystemGlobals.h"


namespace Gasa
{
	inline
	UGasaAbilitySystemComp* GetAbilitySystem(UObject* Object)
	{
		if (Object->Implements<UAbilitySystemInterface>())
		{
			return Cast<UGasaAbilitySystemComp>( Cast<IAbilitySystemInterface>(Object)->GetAbilitySystemComponent() );
		}
		return nullptr;
	}

	// From: UAbilitySystemGlobals::GetAbilitySystemComponentFromActor
	inline
	UGasaAbilitySystemComp* GetAbilitySystem(AActor* Actor, bool LookForComponent = true)
	{
		if (Actor == nullptr)
			return nullptr;

		const IAbilitySystemInterface* ASI = Cast<IAbilitySystemInterface>(Actor);
		if (ASI)
			return Cast<UGasaAbilitySystemComp>(ASI->GetAbilitySystemComponent());

		if (LookForComponent)
		{
			// Fall back to a component search to better support BP-only actors
			return Cast<UGasaAbilitySystemComp>(Actor->FindComponentByClass<UAbilitySystemComponent>());
		}

		return nullptr;
	}
}