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

#pragma once

#include "CoreMinimal.h"
#include "SettingsTabWidget.h"
#include "SettingsGraphicsWidget.generated.h"

class USettingRowWidget;
class USurvivalUserSettings;

/**
 * L'onglet "Graphismes" : les dix curseurs de scalability du moteur, plus une
 * qualite globale qui les pousse tous.
 *
 * Zero logique metier ici : chaque ligne appelle un Set...Quality(0-3) de
 * UGameUserSettings, le moteur fait le reste. C'est l'onglet qui rapporte le
 * plus pour le moins d'effort.
 *
 * Vegetation et Distance d'affichage sont places EN HAUT et non dans l'ordre du
 * moteur : avec SoStylized, ce sont les deux seuls qui decident vraiment si le
 * jeu tourne sur une machine moyenne.
 *
 * Classe Abstract : on cree un WBP_SettingsGraphics qui en herite.
 */
UCLASS(Abstract)
class EMBERWILD_API USettingsGraphicsWidget : public USettingsTabWidget
{
	GENERATED_BODY()

public:
	virtual void NativeConstruct() override;

	virtual void RefreshFromSettings() override;
	virtual void ResetToDefaults() override;

protected:
	/** Bas / Moyen / Élevé / Épique, plus "Personnalisé" que le joueur ne peut pas choisir. */
	UPROPERTY(meta = (BindWidget))
	TObjectPtr<USettingRowWidget> OverallQualityRow;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<USettingRowWidget> ViewDistanceRow;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<USettingRowWidget> FoliageRow;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<USettingRowWidget> ShadowRow;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<USettingRowWidget> TextureRow;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<USettingRowWidget> VisualEffectRow;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<USettingRowWidget> PostProcessRow;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<USettingRowWidget> AntiAliasingRow;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<USettingRowWidget> ReflectionRow;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<USettingRowWidget> GlobalIlluminationRow;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<USettingRowWidget> ShadingRow;

private:
	UFUNCTION()
	void HandleOverallQualityChanged(int32 NewIndex);

	UFUNCTION()
	void HandleViewDistanceChanged(int32 NewIndex);

	UFUNCTION()
	void HandleFoliageChanged(int32 NewIndex);

	UFUNCTION()
	void HandleShadowChanged(int32 NewIndex);

	UFUNCTION()
	void HandleTextureChanged(int32 NewIndex);

	UFUNCTION()
	void HandleVisualEffectChanged(int32 NewIndex);

	UFUNCTION()
	void HandlePostProcessChanged(int32 NewIndex);

	UFUNCTION()
	void HandleAntiAliasingChanged(int32 NewIndex);

	UFUNCTION()
	void HandleReflectionChanged(int32 NewIndex);

	UFUNCTION()
	void HandleGlobalIlluminationChanged(int32 NewIndex);

	UFUNCTION()
	void HandleShadingChanged(int32 NewIndex);

	/** Prepare une ligne de qualite : memes quatre libelles partout. */
	void SetupQualityRow(USettingRowWidget* Row, const FText& Label);

	/** Pousse la scalability et rafraichit la ligne de qualite globale. */
	void ApplyAndRefreshOverall();
};
