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

#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "PauseMenuWidget.generated.h"

class UButton;

/**
 * Le menu de pause : trois boutons par-dessus la partie figee.
 *
 * Comme UMainMenuWidget, il ne decide de rien -- il appelle
 * AFpsPlayerController. Mettre SetPause ou OpenLevel ici serait doublement
 * faux : un widget n'existe que sur la machine du joueur local, et la mise en
 * pause appartient a l'autorite.
 *
 * Classe Abstract : on cree un WBP_PauseMenu qui en herite.
 */
UCLASS(Abstract)
class EMBERWILD_API UPauseMenuWidget : public UUserWidget
{
	GENERATED_BODY()

public:
	UPauseMenuWidget(const FObjectInitializer& ObjectInitializer);

	virtual void NativeConstruct() override;
	virtual void NativeDestruct() override;

	/**
	 * Echap, quand c'est CE widget qui tient le focus clavier.
	 *
	 * Indispensable et pas seulement confortable : les widgets UMG sont des
	 * FRERES du SViewport dans l'arbre Slate, jamais ses enfants. Une touche
	 * remonte donc le long des parents du widget focalise et n'atteint jamais le
	 * viewport -- Enhanced Input ne la voit pas. Or le menu de pause est le seul
	 * ecran in-game plein de UButton, et un bouton prend le focus au clic : sans
	 * ce relais, Echap cesse de refermer le menu des le premier clic dedans.
	 */
	virtual FReply NativeOnKeyDown(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent) override;

	/** Affiche le menu et lui rend le focus clavier. */
	void Open();

	/** Masque le menu. Le focus revient au viewport avec le mode d'input. */
	void Close();

	/**
	 * Actif (cliquable et focalise) ou simplement lisible derriere un ecran pose
	 * par-dessus -- reglages, boite de confirmation.
	 *
	 * Redonner le focus en redevenant actif est la moitie qui manque le plus
	 * souvent : l'ecran qui passait devant l'avait pris pour lui, et personne ne
	 * le rend en se fermant.
	 */
	void SetInteractive(bool bInteractive);

protected:
	/** Reprend la partie. Nomme exactement "ResumeButton" dans le WBP. */
	UPROPERTY(meta = (BindWidget))
	TObjectPtr<UButton> ResumeButton;

	/** Retour au menu principal, apres confirmation. */
	UPROPERTY(meta = (BindWidget))
	TObjectPtr<UButton> QuitToMenuButton;

	/**
	 * BindWidgetOptional : un WBP_PauseMenu sans bouton Reglages reste valide.
	 *
	 * Pas de bouton "Quitter le jeu" ici, volontairement : la sortie se fait
	 * depuis le menu principal, ou l'on repasse de toute facon.
	 */
	UPROPERTY(meta = (BindWidgetOptional))
	TObjectPtr<UButton> SettingsButton;

	/**
	 * Ouvre le panneau d'invitation de l'overlay Steam. C'est la SEULE facon de
	 * faire venir un ami : il n'existe ni navigateur de parties, ni bouton
	 * Rejoindre dans le menu principal.
	 *
	 * Grise tout seul quand l'invitation est impossible -- Steam absent, ou
	 * partie lancee alors qu'il l'etait. Un bouton qui ne repond pas au clic
	 * passe pour un bug ; un bouton grise se comprend tout seul.
	 */
	UPROPERTY(meta = (BindWidgetOptional))
	TObjectPtr<UButton> InviteButton;

private:
	UFUNCTION()
	void HandleResumeClicked();

	UFUNCTION()
	void HandleSettingsClicked();

	UFUNCTION()
	void HandleQuitToMenuClicked();

	UFUNCTION()
	void HandleInviteClicked();
};
