GameFlow.cs
namespace NoChillquarium;

/// <summary>
/// High-level app screens. Gameplay systems hang off <see cref="GameScreen.Playing"/>.
/// </summary>
public enum GameScreen
{
	Warning,
	MainMenu,
	Settings,
	Playing,
	Ending
}

public static class GameFlow
{
	public static GameScreen Screen { get; private set; } = GameScreen.MainMenu;

	public static event Action Changed;

	public static bool CanContinue => SaveGame.HasSave;

	public static void SetScreen( GameScreen screen )
	{
		if ( Screen == screen )
			return;

		Screen = screen;
		Changed?.Invoke();
	}

	public static void AcceptWarning()
	{
		GameAudio.PlayUi( GameAudio.Confirm );
		SetScreen( GameScreen.MainMenu );
		GameAudio.StartMenuMusic();
	}

	public static void OpenSettings()
	{
		GameAudio.PlayUi( GameAudio.Notice );
		SetScreen( GameScreen.Settings );
	}

	public static void CloseSettings()
	{
		GameAudio.PlayUi( GameAudio.Close );
		SetScreen( GameScreen.MainMenu );
	}

	public static void NewGame()
	{
		GameAudio.PlayUi( GameAudio.Confirm );
		GameAudio.StopMusic();
		Economy.ResetForNewGame(); // also clears FeedSystem
		Chaos.Reset();
		Karma.Reset();
		Shop.ResetInventory();
		TankSim.StartNewGame();
		TrainingSystem.Clear();
		BattleSystem.ResetProgress();
		SharkSystem.ResetProgress();
		EndingSystem.Reset();
		ExplodeSystem.Clear();
		DeathFeel.Clear();
		BoomFeel.Clear();
		FusionFeel.Clear();
		BuyReveal.Clear();
		PixelFx.Clear();
		FishRarityInfo.ResetPity();
		FishFusion.Clear();
		DogeFloat.Clear();
		StatFloat.Clear();
		DarkWeb.Clear();
		MethRush.Load( 0 );
		StorySystem.ResetForNewGame();
		GrandmaGifts.ResetForNewGame();
		GrandmaReact.ResetForNewGame();
		JanitorPeep.ResetForNewGame();
		CrimeSystem.ResetForNewGame();
		AchievementSystem.ResetForNewGame();
		WaterFx.Clear();
		LotRunSystem.ResetProgress();
		// Gifts auto-trigger: establishing shot → tank → later wallet. No forced popup.
		SpriteCatalog.Warmup();
		SaveGame.TrySave();
		SetScreen( GameScreen.Playing );
		GameAudio.StartTankMusic();
	}

	public static void ContinueGame()
	{
		if ( !SaveGame.ApplyLoadedSave() )
		{
			GameAudio.PlayUi( GameAudio.Error );
			Log.Warning( "[NO-CHILLquarium] Continue failed — no valid save." );
			return;
		}

		// ApplyLoadedSave already restored FeedSystem / Training syringes / progress.
		// Only clear transient runtime UI — never wipe unlocks again.
		ExplodeSystem.Clear();
		DeathFeel.Clear();
		BoomFeel.Clear();
		FusionFeel.Clear();
		BuyReveal.Clear();
		PixelFx.Clear();
		FishFusion.Clear();
		DogeFloat.Clear();
		StatFloat.Clear();
		TrainingSystem.CancelInject();
		BattleSystem.Clear();
		SharkSystem.Clear();
		GrandmaGifts.Clear(); // no mid-dialogue resume; received flags already loaded
		GrandmaReact.Clear(); // pending quip only; said flags loaded via ApplyLoadedSave
		JanitorPeep.ResetForNewGame();
		CrimeSystem.Clear();
		AchievementSystem.Clear();
		WaterFx.Clear();
		LotRunSystem.Clear();
		SpriteCatalog.Warmup();
		TankSim.ReseatAllDecor();
		GameAudio.PlayUi( GameAudio.Confirm );
		GameAudio.StopMusic();
		SetScreen( GameScreen.Playing );
		GameAudio.StartTankMusic();
	}

	public static void ReturnToMenu()
	{
		GameAudio.PlayUi( GameAudio.Close );
		SaveGame.TrySave();
		GameAudio.StopMusic();
		FeedSystem.Clear();
		ExplodeSystem.Clear();
		BattleSystem.Clear();
		SharkSystem.Clear();
		DeathFeel.Clear();
		BoomFeel.Clear();
		FusionFeel.Clear();
		BuyReveal.Clear();
		PixelFx.Clear();
		FishFusion.Clear();
		StorySystem.Clear();
		GrandmaGifts.Clear();
		GrandmaReact.Clear();
		JanitorPeep.Clear();
		CrimeSystem.Clear();
		AchievementSystem.Clear();
		WaterFx.Clear();
		LotRunSystem.Clear();
		TankSim.Clear();
		SetScreen( GameScreen.MainMenu );
		GameAudio.StartMenuMusic();
	}

	public static void Quit()
	{
		if ( TankSim.IsActive )
			SaveGame.TrySave();

		GameAudio.PlayUi( GameAudio.Close );
		GameAudio.StopMusic();
		Game.Close();
	}
}