#pragma once

#include "CoreMinimal.h"
#include "GameFramework/SaveGame.h"
#include "UIWindowSaveGame.generated.h"

/**
 *  Persistencia de prefs de UI por janela (posicao, e futuramente tamanho,
 *  estado expandido, etc). Usado por UUIDraggableWindow_Base — toda janela
 *  movel registra uma chave (FName WindowId) e grava aqui ao soltar o drag.
 *
 *  Arquivo: [Project]/Saved/SaveGames/UIPrefs_0.sav (binary blob via
 *  UE serializer). Mesmo padrao do [[ZMMOLoginSaveGame]].
 *
 *  Helpers static abaixo encapsulam load-or-create do slot e Get/Set/Save
 *  pra que a Base nao precise repetir a cerimonia.
 */
UCLASS()
class ZMMO_API UZMMOUISaveGame : public USaveGame
{
	GENERATED_BODY()

public:
	/** Posicao normalizada (translation absoluta em pixels da viewport) por janela. */
	UPROPERTY()
	TMap<FName, FVector2D> WindowPositions;

	static const FString SlotName;
	static constexpr int32 UserIndex = 0;

	/**
	 *  Carrega o save existente ou cria um novo (nao salva ainda).
	 *  Sempre retorna instancia valida.
	 */
	static UZMMOUISaveGame* LoadOrCreate();

	/** Salva o slot atual (sincrono — chamado on-mouse-up, custo baixo). */
	static void SaveNow(UZMMOUISaveGame* Save);

	/** Get com default — se WindowId nao foi gravado retorna FVector2D::ZeroVector. */
	UFUNCTION(BlueprintCallable, Category = "UI|Prefs")
	bool TryGetWindowPosition(FName WindowId, FVector2D& OutPos) const;

	UFUNCTION(BlueprintCallable, Category = "UI|Prefs")
	void SetWindowPosition(FName WindowId, FVector2D Pos);
};
