// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "the_twilight_abyss/BaseItems/Items/BaseItem.h"
#include "Camera/CameraComponent.h"
#include "Engine/PostProcessVolume.h"
#include "Components/WidgetInteractionComponent.h"
#include "../TurnBasedCombatV2/TurnBaseCombatV2.h"
#include "TempCharacter.generated.h"

UCLASS()
class THE_TWILIGHT_ABYSS_API ATempCharacter : public ACharacter
{
	GENERATED_BODY()

public:
	// Sets default values for this character's properties
	ATempCharacter();
	void ResetWidgetPointer() const;

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

	void ForwardInput(float Axis);
	void RightMoveInput(float Axis);

	UFUNCTION()
	void Sneak();

	UCapsuleComponent* PlayerCapsule;
	UPROPERTY()
	APlayerController* FirstPlayerController;
	UPROPERTY()
	UWidgetInteractionComponent* WidgetPointer;
	UPROPERTY()
	ATurnBaseCombatV2* CombatSystem;

public:
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Inventory, meta = (AllowPrivateAccess = "true"))
	class UInventoryComponent* Inventory; //Using the InventoryComponent class
	
	
	// Called to bind functionality to input
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

	void KeyPressed();

	UPROPERTY(EditAnyWhere)
	float TraceDistance = 200;

	UFUNCTION(BlueprintCallable)
	void InputDisabler();

	void LineTraceLogic();

	UPROPERTY()
	class UPawnNoiseEmitterComponent* NoiseEmitter;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category= "Health")
	float Health;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category= "Gold")
	int GoldBalance;

	UPROPERTY(VisibleDefaultsOnly, Category = "LineTrace")
	bool bHit;

	//Using the item in the inventory
	UFUNCTION(BlueprintCallable, Category= "Items")
	void UseItem(class UBaseItem* Item); // Overriding the BaseItem Class

	UFUNCTION(BlueprintCallable)
	void InputEnabler();

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera")
	UCameraComponent* ThisCamera;

	FVector OriginalCameraLocation;

	FRotator OriginalCameraRotation;

	int OriginalCameraFOV;

	UFUNCTION(BlueprintCallable, Category= "Items")
	void BuyItem(AActor* Item);

	bool bShopKeeperText = false;

	UPROPERTY(BlueprintReadWrite)
	bool disableTab = false;

	APostProcessVolume* PostProcessVolume;

	TArray<AActor*> AIActors;

	FName Enemy;

	FName Ammo;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float ReactionSpeed = 100.0f;

	bool isInStealth = false;

	UPROPERTY()
	UUserWidget* ImportantStatsWidget;
	
	UPROPERTY()
	UUserWidget* CrossHairWidget;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widgets")
	UUserWidget* ImportantStats;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widgets")
	UUserWidget* InventoryWidget;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widgets")
	UUserWidget* EscapeMenuWidget;
	
	UPROPERTY(EditAnywhere, Category= "Widgets")
	TSubclassOf<UUserWidget> ImportantStatsSub;

	UPROPERTY(EditAnywhere, Category= "Widgets")
	TSubclassOf<UUserWidget> InventoryMenuSub;

	UPROPERTY(EditAnywhere, Category= "Widgets")
	TSubclassOf<UUserWidget> EscapeMenuSub;

	UPROPERTY(EditAnywhere, Category= "Widgets")
	TSubclassOf<UUserWidget> CrossHairSub;

private:
	
	UPROPERTY()
	FHitResult OutHit;

	UFUNCTION()
	void AddToInventory();
};