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

#pragma once

#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "SurvivalGameInstance.generated.h"

class UInputMappingContext;
class ULocalPlayer;

/**
 * Le seul objet qui survit aux changements de map.
 *
 * C'est l'equivalent le plus proche d'un singleton DontDestroyOnLoad d'Unity :
 * il naît au lancement du jeu et meurt a sa fermeture. Tout le reste --
 * GameMode, GameState, PlayerController, pawns, widgets -- est detruit et
 * recree a chaque OpenLevel.
 *
 * Y mettre : les reglages, la sauvegarde en cours, et plus tard l'hebergement
 * et le rejoindre-une-partie. Surtout pas d'etat de gameplay, qui appartient au
 * monde et doit disparaitre avec lui.
 */
UCLASS()
class SURVIVAL_PROJET_API USurvivalGameInstance : public UGameInstance
{
	GENERATED_BODY()

public:
	virtual void Init() override;

	/** Nom de la derniere camera de menu utilisee. NAME_None au premier lancement. */
	UFUNCTION(BlueprintPure, Category = "Menu")
	FName GetLastMenuCameraName() const { return LastMenuCameraName; }

	UFUNCTION(BlueprintCallable, Category = "Menu")
	void SetLastMenuCameraName(FName SpotName) { LastMenuCameraName = SpotName; }

	/**
	 * Declare les IMC remappables aupres des reglages d'input du joueur.
	 *
	 * Appelee A LA DEMANDE, par l'ecran de reglages avant de lire les touches, et
	 * non depuis un evenement de demarrage. Raison : UserSettings n'est cree que
	 * dans UEnhancedInputLocalPlayerSubsystem::PlayerControllerChanged, et
	 * ULocalPlayer diffuse ses evenements AVANT de prevenir ses sous-systemes --
	 * tout hook precoce arrive donc trop tot, quel qu'il soit.
	 *
	 * Idempotente : le moteur ignore un contexte deja connu.
	 */
	UFUNCTION(BlueprintCallable, Category = "Input")
	void RegisterMappableContexts();

protected:
	/**
	 * Les mapping contexts dont les touches sont remappables. Mets-y IMC_Default.
	 *
	 * Ici et PAS sur le pawn : le menu principal n'a aucun pawn, et l'ecran de
	 * reglages doit pourtant afficher les touches. C'est le critere habituel --
	 * "est-ce que ca doit survivre au changement de map ?" -- qui envoie cette
	 * liste sur le GameInstance.
	 */
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Input")
	TArray<TObjectPtr<UInputMappingContext>> MappableContexts;

private:
	/**
	 * Stocke un NOM et pas un index : les index changent des qu'on ajoute ou
	 * supprime une camera dans la map, et on retomberait sur autre chose.
	 *
	 * Ne sert qu'a eviter de retirer deux fois de suite le meme angle quand le
	 * joueur revient au menu -- d'ou le Transient, ca n'a pas a etre sauvegarde.
	 */
	UPROPERTY(Transient)
	FName LastMenuCameraName = NAME_None;
};
