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


#include "SurvivalGameInstance.h"

#include "EnhancedInputSubsystems.h"
#include "Engine/LocalPlayer.h"
#include "InputMappingContext.h"
#include "SurvivalUserSettings.h"
#include "UserSettings/EnhancedInputUserSettings.h"

void USurvivalGameInstance::Init()
{
	Super::Init();

	// Pas d'enregistrement des IMC ici : a ce stade il n'y a ni joueur local ni
	// PlayerController, donc pas encore de UserSettings a qui parler.
	// RegisterMappableContexts() est appelee par l'ecran de reglages.

	// Les reglages sont deja LUS depuis le .ini par le moteur, mais rien ne les
	// a encore APPLIQUES : sans cet appel, la resolution et la qualite
	// choisies au dernier lancement resteraient lettre morte jusqu'au premier
	// passage dans le menu.
	//
	// C'est le bon endroit : le GameInstance est le seul objet qui naisse avant
	// la premiere map et survive a tous les changements de niveau.
	if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
	{
		Settings->ApplySettings(/*bCheckForCommandLineOverrides=*/false);
	}
	else
	{
		UE_LOG(LogTemp, Error, TEXT("USurvivalGameInstance : GameUserSettingsClassName n'est pas configure dans DefaultEngine.ini, aucun reglage ne sera pris en compte."));
	}
}

void USurvivalGameInstance::RegisterMappableContexts()
{
	ULocalPlayer* LocalPlayer = GetFirstGamePlayer();
	if (!LocalPlayer)
	{
		UE_LOG(LogTemp, Warning, TEXT("USurvivalGameInstance : aucun joueur local, enregistrement des touches remis a plus tard."));
		return;
	}

	if (MappableContexts.IsEmpty())
	{
		UE_LOG(LogTemp, Warning, TEXT("USurvivalGameInstance : MappableContexts est vide, l'onglet Touches affichera 'Non assignee' partout. Ajoute IMC_Default dans le Blueprint de GameInstance."));
		return;
	}

	UEnhancedInputLocalPlayerSubsystem* Subsystem = LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>();
	UEnhancedInputUserSettings* InputSettings = Subsystem ? Subsystem->GetUserSettings() : nullptr;

	if (!InputSettings)
	{
		UE_LOG(LogTemp, Error, TEXT("USurvivalGameInstance : reglages d'input introuvables. Coche 'Enable User Settings' dans Project Settings > Enhanced Input."));
		return;
	}

	for (const TObjectPtr<UInputMappingContext>& Context : MappableContexts)
	{
		if (Context)
		{
			// Idempotent : le moteur ignore un contexte deja connu, on peut donc
			// rappeler cette fonction sans precaution.
			InputSettings->RegisterInputMappingContext(Context);
		}
	}
}
