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

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Info.h"
#include "MusicSubsystem.h"
#include "MusicDirector.generated.h"

class UMusicPlaylistDataAsset;

/**
 * Declare la musique du jeu. UN SEUL exemplaire suffit, dans la premiere map
 * chargee -- typiquement la scene de menu.
 *
 * Il ne joue rien lui-meme et ne survit pas a sa map : il transmet sa consigne a
 * UMusicSubsystem, qui, lui, vit sur le GameInstance et traverse tous les
 * changements de niveau. C'est pour ca que les maps suivantes n'ont besoin de
 * rien : la musique continue toute seule, et la regle de transition a deja ete
 * posee ici.
 *
 * En poser un second dans une autre map reste possible : il change alors de
 * playlist a l'arrivee sur celle-la.
 *
 * Derive d'AInfo : aucun visuel, aucun tick, et AInfo se declare non
 * spatialement charge, donc il est present des le demarrage meme en World
 * Partition -- un acteur ordinaire hors de la zone de streaming ne ferait jamais
 * son BeginPlay.
 */
UCLASS(ClassGroup = "Audio", meta = (DisplayName = "Music Director"))
class EMBERWILD_API AMusicDirector : public AInfo
{
	GENERATED_BODY()

public:
	AMusicDirector();

protected:
	virtual void BeginPlay() override;

	/**
	 * La playlist a lancer en arrivant sur cette map.
	 *
	 * Si c'est deja elle qui tourne, elle n'est pas relancee. La laisser vide veut
	 * dire "je ne change pas la musique en cours", et n'a d'interet que sur un
	 * second Director pose uniquement pour changer la regle de transition.
	 */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Musique")
	TObjectPtr<UMusicPlaylistDataAsset> Playlist;

	/**
	 * Ce que devient le morceau en cours a CHAQUE changement de scene suivant.
	 *
	 * Continue : il poursuit sa route par-dessus le chargement.
	 * New      : il s'eteint et le lecteur en demarre un autre -- tirage aleatoire
	 *            ou morceau suivant, selon le mode de la playlist.
	 *
	 * La consigne est envoyee au lecteur, qui la garde : les autres maps n'ont
	 * rien a declarer.
	 */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Musique")
	EMusicLevelChangeMode LevelChangeMode = EMusicLevelChangeMode::Continue;
};
