using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; namespace AibisDream.UI { public class TerminalChapterPanel : MonoBehaviour { [SerializeField] private TerminalPanelAnimator panelAnimator; [SerializeField] private TerminalChapterItemView leftPreview; [SerializeField] private TerminalChapterItemView currentView; [SerializeField] private TerminalChapterItemView rightPreview; [SerializeField] private TMP_Text emptyText; [SerializeField] private TMP_Text selectedTitleText; [SerializeField] private Button previousButton; [SerializeField] private Button nextButton; [SerializeField] private Button restartButton; [SerializeField] private Button backButton; private readonly List _chapters = new List(); private int _currentIndex; public bool IsOpen => gameObject.activeSelf; private TerminalPanel _owner; public void SetOwner(TerminalPanel owner) { _owner = owner; } private void Awake() { previousButton?.onClick.AddListener(Previous); nextButton?.onClick.AddListener(Next); restartButton?.onClick.AddListener(Restart); backButton?.onClick.AddListener(Close); } private void OnDestroy() { previousButton?.onClick.RemoveListener(Previous); nextButton?.onClick.RemoveListener(Next); restartButton?.onClick.RemoveListener(Restart); backButton?.onClick.RemoveListener(Close); } public void Show() { if (panelAnimator != null) { panelAnimator.Show(prepare: PrepareContent); } else { PrepareContent(); gameObject.SetActive(true); } } public void Hide(Action onComplete = null) { if (panelAnimator != null) { panelAnimator.Hide(onComplete); } else { gameObject.SetActive(false); onComplete?.Invoke(); } } private void PrepareContent() { _owner?.SetHeader("terminal_header_chapter", "REPAIR_STATION_07 - AUTH_VERIFIED"); LoadChapters(); RefreshViews(); } public void Close() { _owner.Back(); } private void LoadChapters() { _chapters.Clear(); var chapters = ChapterController.Instance.GetChapterList(); _chapters.AddRange(chapters); _currentIndex = Mathf.Clamp(_currentIndex, 0, Mathf.Max(0, _chapters.Count - 1)); } private void RefreshViews() { var hasChapters = _chapters.Count > 0; if (emptyText != null) { emptyText.gameObject.SetActive(!hasChapters); } var showLeftPreview = hasChapters && _currentIndex > 0; var showRightPreview = hasChapters && _currentIndex < _chapters.Count - 1; SetViewActive(leftPreview, showLeftPreview); SetViewActive(currentView, hasChapters); SetViewActive(rightPreview, showRightPreview); if (!hasChapters) { if (selectedTitleText != null) { selectedTitleText.text = "NO CHAPTER DATA"; } restartButton?.gameObject.SetActive(false); UpdateNavigationButtons(false); return; } var current = _chapters[_currentIndex]; currentView?.Init(current, selected: true, preview: false); if (showLeftPreview) { leftPreview?.Init(_chapters[_currentIndex - 1], selected: false, preview: true); } if (showRightPreview) { rightPreview?.Init(_chapters[_currentIndex + 1], selected: false, preview: true); } if (selectedTitleText != null) { selectedTitleText.text = current.title; } restartButton?.gameObject.SetActive(true); UpdateNavigationButtons(true); } private void UpdateNavigationButtons(bool hasChapters) { if (previousButton != null) { previousButton.interactable = hasChapters && _currentIndex > 0; } if (nextButton != null) { nextButton.interactable = hasChapters && _currentIndex < _chapters.Count - 1; } } private static void SetViewActive(TerminalChapterItemView view, bool active) { if (view != null) { view.gameObject.SetActive(active); } } private void Previous() { if (_chapters.Count == 0 || _currentIndex <= 0) { return; } _currentIndex--; RefreshViews(); } private void Next() { if (_chapters.Count == 0 || _currentIndex >= _chapters.Count - 1) { return; } _currentIndex++; RefreshViews(); } private void Restart() { if (_chapters.Count == 0) { return; } var chapter = _chapters[_currentIndex]; _owner.CloseThen(() => ChapterController.Instance.StartWithChapter(chapter)); } } }