// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "InputAction.h"
//#include "AIModule/Classes/GenericTeamAgentInterface.h"
#include "hwanyoung2.h"
#include "Components/SphereComponent.h"
#include "hwanyoung2Character.generated.h"


UCLASS(config=Game)
class Ahwanyoung2Character : public ACharacter/*, public UGenericTeamAgentInterface*/
{
	GENERATED_BODY()

	/** Camera boom positioning the camera behind the character */
	UPROPERTY(BlueprintReadWrite, Category = Camera, meta = (AllowPrivateAccess = "true"))
	class USpringArmComponent* CameraBoom;

	/** Follow camera */
	UPROPERTY(BlueprintReadWrite, Category = Camera, meta = (AllowPrivateAccess = "true"))
	class UCameraComponent* FollowCamera;

	/** Collection sphere */ 
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
	class USphereComponent* CollectionSphere;

#pragma region Character Gameplay Input Action
	/** MappingContext */
	UPROPERTY(EditAnywhere, Category = Input, meta = (AllowPrivateAccess = "true"))
	class UInputMappingContext* InputMapping;

	/** Jump Input Action */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
	class UInputAction* JumpAction;

	/** Move Input Action */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
	class UInputAction* MoveAction;

	/** Look Input Action */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
	class UInputAction* LookAction;

	/** Walk Input Action */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
	class UInputAction* WalkAction;

#pragma endregion

private:
	//Helper function for 
	void Initialize();

public:

	Ahwanyoung2Character();

	//Updates the AbilitysystemComponent's actorInfo, especially in a multiplayer environment
	//Gets called on the server (so basically my end)
	virtual void PossessedBy(AController* NewController) override;


	UFUNCTION(BlueprintCallable, Category = "HY_Character|Camera")
	float GetStartingCameraBoomArmLength();

	UFUNCTION(BlueprintCallable, Category = "HY_Character|Camera")
	FVector GetStartingCameraBoomLocation();


	/** Returns CameraBoom subobject **/
	class USpringArmComponent* GetCameraBoom() const { return CameraBoom; }
	/** Returns FollowCamera subobject **/
	class UCameraComponent* GetFollowCamera() const { return FollowCamera; }

	virtual void Tick(float DeltaTime) override;

protected:

	UPROPERTY(BlueprintReadOnly, Category = "HY_Character|Camera")
	float StartingCameraBoomArmLength;

	UPROPERTY(BlueprintReadOnly, Category = "HY_Character|Camera")
	FVector StartingCameraBoomLocation;

	UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "HY_Character|Camera")
	float BaseTurnRate = 45.0f;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "HY_Character|Camera")
	float BaseLookUpRate = 45.0f;


	UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Hwanyoung|Character")
	FText CharacterName;

	/** Called for movement input */
	void Move(const FInputActionValue& Value);

	/** Called for looking input */
	void Look(const FInputActionValue& Value);

	/** Called for checking for the closest Interactable in sight and in range*/
	void CheckForInteractables();

	/** Called for collecting automatic pick-upable interactables*/
	void CollectAutoPickups();

protected:
	// APawn interface
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

	// To add mapping context
	virtual void BeginPlay();

	/*virtual void SetGenericTeamId(const FGenericTeamId& NewTeamID);
	virtual FGenericTeamId GetGenericTeamId() const;*/

};

