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

#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "SurvivalStatsWidget.generated.h"

class UProgressBar;
class USurvivalStatsComponent;

/**
 * Les trois jauges de survie : vie, faim, soif.
 *
 * Aucun Tick : le widget s'abonne a OnStatsChanged, qui ne se declenche
 * qu'une fois par seconde ou lors d'une consommation.
 */
UCLASS(Abstract)
class EMBERWILD_API USurvivalStatsWidget : public UUserWidget
{
	GENERATED_BODY()

public:
	virtual void NativeConstruct() override;
	virtual void NativeDestruct() override;

	UFUNCTION(BlueprintCallable, Category = "Survie")
	void Refresh();

	/** (Re)branche sur les stats du pawn possede. Voir UInventoryWidget. */
	void BindToOwningPawn();

protected:
	/** A nommer exactement "HealthBar", "HungerBar" et "ThirstBar". */
	UPROPERTY(meta = (BindWidget))
	TObjectPtr<UProgressBar> HealthBar;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<UProgressBar> HungerBar;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<UProgressBar> ThirstBar;

	/** En dessous de ce ratio, la barre passe en couleur d'alerte. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Survie", meta = (ClampMin = "0", ClampMax = "1"))
	float CriticalThreshold = 0.2f;

	/** Couleur d'alerte, commune aux trois jauges. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Survie")
	FLinearColor CriticalColor = FLinearColor(0.9f, 0.1f, 0.1f, 1.f);

private:
	UFUNCTION()
	void HandleStatsChanged();

	USurvivalStatsComponent* ResolveStats() const;

	/** Applique le remplissage et la couleur d'une barre. */
	void ApplyBar(UProgressBar* Bar, float Percent, const FLinearColor& BaseColor) const;

	TWeakObjectPtr<USurvivalStatsComponent> BoundStats;

	/**
	 * Couleurs d'origine relevees au NativeConstruct.
	 *
	 * On les capture depuis les widgets eux-memes plutot que de les redeclarer
	 * en C++ : la palette reste entierement dans le Designer, et le code ne
	 * fait que basculer vers l'alerte puis revenir.
	 */
	FLinearColor HealthBaseColor = FLinearColor::White;
	FLinearColor HungerBaseColor = FLinearColor::White;
	FLinearColor ThirstBaseColor = FLinearColor::White;
};
