using System; using YachtDice.Categories; using YachtDice.Economy; using YachtDice.Game; using YachtDice.Inventory; using YachtDice.Player; using YachtDice.Scoring; using YachtDice.Shop; namespace YachtDice.UI.Presentation { public sealed class GameFlowPresenter : IDisposable { private readonly GameManager _gameManager; private readonly ScoringSystem _scoringSystem; private readonly DiceManager _diceManager; private readonly CurrencyBank _currencyBank; private readonly ShopController _shopController; private readonly InventoryController _inventoryController; private readonly CategoryCatalog _categoryCatalog; private readonly PlayerModel _playerModel; private readonly IGameSaveService _saveService; private readonly IScoreSummaryService _scoreSummaryService; private readonly DicePanelPresenter _dicePanelPresenter; private readonly ScoreCardPresenter _scoreCardPresenter; private readonly GameInfoPresenter _gameInfoPresenter; public GameFlowPresenter( GameManager gameManager, ScoringSystem scoringSystem, DiceManager diceManager, CurrencyBank currencyBank, ShopController shopController, InventoryController inventoryController, CategoryCatalog categoryCatalog, PlayerModel playerModel, IGameSaveService saveService, IScoreSummaryService scoreSummaryService, DicePanelPresenter dicePanelPresenter, ScoreCardPresenter scoreCardPresenter, GameInfoPresenter gameInfoPresenter) { _gameManager = gameManager; _scoringSystem = scoringSystem; _diceManager = diceManager; _currencyBank = currencyBank; _shopController = shopController; _inventoryController = inventoryController; _categoryCatalog = categoryCatalog; _playerModel = playerModel; _saveService = saveService; _scoreSummaryService = scoreSummaryService; _dicePanelPresenter = dicePanelPresenter; _scoreCardPresenter = scoreCardPresenter; _gameInfoPresenter = gameInfoPresenter; } public void Initialize() { _gameManager.OnTurnStarted += HandleTurnStarted; _gameManager.OnRollComplete += HandleRollComplete; _gameManager.OnScored += HandleScored; _gameManager.OnGameOver += HandleGameOver; _dicePanelPresenter.RollClicked += HandleRollClicked; _dicePanelPresenter.DiceToggled += HandleDiceToggled; _scoreCardPresenter.CategorySelected += HandleCategorySelected; _gameInfoPresenter.NewGameClicked += HandleNewGameClicked; _gameInfoPresenter.ShopClicked += HandleShopClicked; _gameInfoPresenter.InventoryClicked += HandleInventoryClicked; _currencyBank.OnBalanceChanged += HandleCurrencyChanged; _playerModel.OnChanged += HandlePlayerChangedForSave; _saveService.Load(); _gameInfoPresenter.SetCurrencyText(_currencyBank.Balance); _gameManager.StartNewGame(); } public void Dispose() { _gameManager.OnTurnStarted -= HandleTurnStarted; _gameManager.OnRollComplete -= HandleRollComplete; _gameManager.OnScored -= HandleScored; _gameManager.OnGameOver -= HandleGameOver; _dicePanelPresenter.RollClicked -= HandleRollClicked; _dicePanelPresenter.DiceToggled -= HandleDiceToggled; _scoreCardPresenter.CategorySelected -= HandleCategorySelected; _gameInfoPresenter.NewGameClicked -= HandleNewGameClicked; _gameInfoPresenter.ShopClicked -= HandleShopClicked; _gameInfoPresenter.InventoryClicked -= HandleInventoryClicked; _currencyBank.OnBalanceChanged -= HandleCurrencyChanged; if (_playerModel != null) _playerModel.OnChanged -= HandlePlayerChangedForSave; } private void HandleTurnStarted(int turn) { _gameInfoPresenter.SetTurnText(turn, _categoryCatalog.Count); _dicePanelPresenter.ResetForNewTurn(); _scoreCardPresenter.ClearAllPreviews(); } private void HandleRollComplete(int rollNumber) { _dicePanelPresenter.HandleRollComplete(rollNumber); _scoreCardPresenter.UpdatePreviewScores(); } private void HandleScored(CategoryDefinition category, int finalScore) { _scoreCardPresenter.SetCategoryScored(category, finalScore); _scoreCardPresenter.UpdateTotalDisplay(_scoreSummaryService.Calculate()); _saveService.Save(); } private void HandleGameOver(int totalScore) { _dicePanelPresenter.HandleGameOver(); _scoreCardPresenter.SetAllInteractable(false); _gameInfoPresenter.ShowGameOver(_scoreSummaryService.Calculate().DisplayTotal); _saveService.Save(); } private void HandleRollClicked() { if (!_gameManager.CanRoll) return; _dicePanelPresenter.PrepareForRoll(); _scoreCardPresenter.SetAllInteractable(false); _gameManager.Roll(); } private void HandleDiceToggled(int index) { if (_gameManager.CurrentRoll == 0) return; if (_diceManager.IsAnyRolling) return; _gameManager.ToggleDiceLock(index); _dicePanelPresenter.SetDiceLocked(index, _diceManager.IsLocked(index)); } private void HandleCategorySelected(CategoryDefinition category) { if (!_gameManager.CanScore) return; if (_scoringSystem.IsCategoryUsed(category)) return; _gameManager.ScoreInCategory(category); } private void HandleNewGameClicked() { _gameInfoPresenter.HideGameOver(); _scoreCardPresenter.ResetAll(); _dicePanelPresenter.ResetForNewGame(); _gameManager.StartNewGame(); } private void HandleShopClicked() { _shopController.ToggleVisibility(); } private void HandleInventoryClicked() { _inventoryController.ToggleVisibility(); } private void HandleCurrencyChanged(int newBalance) { _gameInfoPresenter.SetCurrencyText(newBalance); } private void HandlePlayerChangedForSave() { _saveService.Save(); } } }