using Minesweeper.Config; using Minesweeper.Presentation.Views; using UnityEngine; namespace Minesweeper.Presentation.Factories { public sealed class MinesweeperScreenBootstrapper { private const string MainMenuPanelName = "MainMenuPanel"; private const string BoardGridName = "BoardGrid"; private const string PausePanelName = "PausePanel"; private const string ResultPanelName = "ResultPanel"; public MinesweeperScreenRefs Spawn(Transform contentRoot, MinesweeperScreenCatalog catalog) { if (contentRoot == null) { Debug.LogError("Minesweeper screen bootstrap failed: Content root is not assigned."); return default; } if (catalog == null || !catalog.IsValid) { Debug.LogError("Minesweeper screen bootstrap failed: screen catalog prefab references are incomplete."); return default; } ClearContent(contentRoot); var mainMenu = SpawnScreen(catalog.MainMenuPanelPrefab, contentRoot, MainMenuPanelName, 0); var board = SpawnScreen(catalog.BoardGridPrefab, contentRoot, BoardGridName, 1); var pause = SpawnScreen(catalog.PausePanelPrefab, contentRoot, PausePanelName, 2); var result = SpawnScreen(catalog.ResultPanelPrefab, contentRoot, ResultPanelName, 3); var mainMenuView = RequireComponent(mainMenu.transform, MainMenuPanelName); if (mainMenuView != null) { mainMenuView.BindRoot(mainMenu); } var boardView = RequireComponent(board.transform, BoardGridName); var pauseView = RequireComponent(pause.transform, PausePanelName); var resultView = RequireComponent(result.transform, ResultPanelName); var refs = new MinesweeperScreenRefs( mainMenuView, boardView, pauseView, resultView); mainMenu.SetActive(false); board.SetActive(false); pause.SetActive(false); result.SetActive(false); return refs; } private static GameObject SpawnScreen(GameObject prefab, Transform parent, string expectedName, int siblingIndex) { var instance = Object.Instantiate(prefab, parent, false); instance.name = expectedName; instance.transform.SetSiblingIndex(siblingIndex); Stretch(instance.GetComponent()); return instance; } private static void ClearContent(Transform contentRoot) { for (var i = contentRoot.childCount - 1; i >= 0; i--) { var child = contentRoot.GetChild(i); child.SetParent(null, false); Object.Destroy(child.gameObject); } } private static T RequireComponent(Transform root, string ownerName) where T : Component { var component = root.GetComponent(); if (component == null) { Debug.LogError($"Minesweeper screen bootstrap failed: '{ownerName}' is missing {typeof(T).Name}."); } return component; } private static void Stretch(RectTransform rectTransform) { if (rectTransform == null) { return; } rectTransform.anchorMin = Vector2.zero; rectTransform.anchorMax = Vector2.one; rectTransform.offsetMin = Vector2.zero; rectTransform.offsetMax = Vector2.zero; } } }