// Icon Studio - Mathew Simon

#pragma once

#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "IconStudioTypes.h"
#include "IconStudioSession.generated.h"

class UIconStudioPreset;

/**
 * Ce sur quoi on travaille en ce moment : le preset choisi, l'objet affiche,
 * la liste du prochain lot.
 *
 * Cet objet n'existe que pour etre pose dans un widget Details View. C'est ce
 * qui evite d'avoir a dessiner une interface : le moteur genere lui-meme les
 * champs, les listes deroulantes et les selecteurs d'assets a partir des
 * UPROPERTY ci-dessous. Ajouter un reglage a l'outil ne demande donc aucune
 * retouche du Widget Blueprint.
 *
 * Il est transitoire a dessein : une session de travail ne se sauvegarde pas,
 * ce qui doit survivre est dans le preset.
 */
UCLASS(BlueprintType)
class ICONSTUDIO_API UIconStudioSession : public UObject
{
	GENERATED_BODY()

public:
	/** Le look applique. Sans preset, rien ne se rend. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Subject")
	TObjectPtr<UIconStudioPreset> Preset;

	/**
	 * L'objet affiche dans la previsualisation : un StaticMesh directement, ou
	 * un DataAsset dont on ira lire le mesh par reflexion.
	 */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Subject", meta = (AllowedClasses = "/Script/Engine.StaticMesh,/Script/Engine.DataAsset"))
	TObjectPtr<UObject> Subject;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Subject")
	EIconStudioPass Pass = EIconStudioPass::Final;

	/** Les objets traites par le bouton de lot. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Batch", meta = (AllowedClasses = "/Script/Engine.StaticMesh,/Script/Engine.DataAsset"))
	TArray<TObjectPtr<UObject>> BatchTargets;

	/**
	 * Ecrit la texture generee dans le champ d'icone du DataAsset.
	 * Sans effet sur un StaticMesh, qui n'a pas de champ ou ecrire.
	 */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Batch")
	bool bAssignIconToDataAsset = true;

	/** Laisse tranquille les objets qui ont deja une icone. Utile pour completer un lot. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Batch")
	bool bSkipIfIconAlreadySet = false;

	/** Prevenu des qu'un champ change, pour relancer la previsualisation. */
	DECLARE_MULTICAST_DELEGATE(FOnIconStudioSessionChanged);
	FOnIconStudioSessionChanged OnSessionChanged;

#if WITH_EDITOR
	virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
#endif
};
