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

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CraftingRecipeDataAsset.h"
#include "Interactable.h"
#include "CraftingStation.generated.h"

class UStaticMeshComponent;

/**
 * Un poste de travail pose dans le monde : etabli, et ce qui suivra.
 *
 * Il ne fabrique rien lui-meme et ne contient aucune recette. Tout ce qu'il
 * fait, c'est ouvrir l'ecran de fabrication en annoncant SON type de poste --
 * le reste appartient au UCraftingComponent du joueur, qui filtrera les
 * recettes en consequence.
 *
 * L'acces au poste ne dure que le temps de l'ecran : c'est le controller qui
 * l'accorde a l'ouverture et le reprend a la fermeture. Un etabli qui donnerait
 * son acces "par proximite" obligerait a surveiller la distance en permanence,
 * pour un resultat que le joueur comprendrait moins bien -- ici on fabrique a
 * l'etabli parce qu'on est en train de s'en servir.
 *
 * Un seul BP_CraftingStation suffit pour tous les postes : c'est StationType
 * qui change par instance, comme ItemData sur BP_Pickup.
 */
UCLASS()
class EMBERWILD_API ACraftingStation : public AActor, public IInteractable
{
	GENERATED_BODY()

public:
	ACraftingStation();

	// --- IInteractable ---
	virtual FText GetInteractionPrompt_Implementation(AActor* Interactor) const override;
	virtual void Interact_Implementation(AActor* Interactor) override;

protected:
	/**
	 * Le visuel ET la surface d'interaction.
	 *
	 * Pas de sphere dediee ici, contrairement a APickupItem : un poste est un
	 * meuble construit, dont le mesh a une vraie collision simple. Une sphere
	 * autour d'un volume pareil serait touchee AVANT lui -- le trace s'arrete au
	 * premier bloqueur -- et le prompt apparaitrait en visant le vide autour, ou
	 * masquerait un objet pose au pied du meuble.
	 *
	 * Corollaire : le mesh assigne doit avoir une collision simple. Sans elle,
	 * le trace le traverse, puisqu'il est lance en bTraceComplex = false.
	 */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Crafting")
	TObjectPtr<UStaticMeshComponent> Mesh;

	/** Le poste que cet acteur rend accessible pendant qu'on s'en sert. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Crafting")
	ECraftingStation StationType = ECraftingStation::Workbench;

	/** Texte affiche quand le joueur vise le poste. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Crafting")
	FText InteractionPrompt;
};
