using System.Collections.Generic; using AppleHills.Data.CardSystem; using Core; using TMPro; using UnityEngine; using UnityEngine.UI; using UI.CardSystem.StateMachine; using UI.CardSystem.StateMachine.States; namespace UI.CardSystem.Testing { /// /// Test controller for card state machine testing. /// Provides UI controls to manually test state transitions, animations, and flows. /// public class CardTestController : MonoBehaviour { [Header("Test Card")] [SerializeField] private Card testCard; [SerializeField] private CardData testCardData; [Header("Album Slots for Drag Testing")] [SerializeField] private AlbumCardSlot slot1; [SerializeField] private AlbumCardSlot slot2; [Header("UI References")] [SerializeField] private TextMeshProUGUI eventLogText; [SerializeField] private Toggle isNewToggle; [SerializeField] private Slider repeatCountSlider; [SerializeField] private TextMeshProUGUI repeatCountLabel; [SerializeField] private TMP_Dropdown rarityDropdown; [SerializeField] private Toggle isClickableToggle; [SerializeField] private TextMeshProUGUI currentStateText; private List _eventLog = new List(); private CardContext _cardContext; private Vector3 _originalCardPosition; private void Awake() { if (testCard != null) { _cardContext = testCard.GetComponent(); _originalCardPosition = testCard.transform.position; // Subscribe to all card events if (_cardContext != null) { _cardContext.OnFlipComplete += OnCardFlipComplete; _cardContext.OnCardDismissed += OnCardDismissed; _cardContext.OnCardInteractionComplete += OnCardInteractionComplete; _cardContext.OnUpgradeTriggered += OnCardUpgradeTriggered; } } // Setup UI listeners if (repeatCountSlider != null) { repeatCountSlider.onValueChanged.AddListener(OnRepeatCountChanged); } if (isClickableToggle != null) { isClickableToggle.onValueChanged.AddListener(OnIsClickableToggled); } } private void Start() { // Initialize card with test data if (testCard != null && testCardData != null && _cardContext != null) { _cardContext.SetupCard(testCardData, isNew: true, repeatCount: 0); } LogEvent("Card Test Scene Initialized"); UpdateCurrentStateDisplay(); } private void Update() { // Update current state display every frame if (Time.frameCount % 30 == 0) // Every 0.5 seconds at 60fps { UpdateCurrentStateDisplay(); } } #region State Transition Buttons public void TransitionToIdleState() { _cardContext?.StateMachine.ChangeState("IdleState"); LogEvent("Transitioned to IdleState"); } public void TransitionToRevealedState() { _cardContext?.StateMachine.ChangeState("RevealedState"); LogEvent("Transitioned to RevealedState"); } public void TransitionToEnlargedNewState() { _cardContext?.StateMachine.ChangeState("EnlargedNewState"); LogEvent("Transitioned to EnlargedNewState"); } public void TransitionToEnlargedRepeatState() { _cardContext?.StateMachine.ChangeState("EnlargedRepeatState"); LogEvent("Transitioned to EnlargedRepeatState"); } public void TransitionToDraggingState() { _cardContext?.StateMachine.ChangeState("DraggingState"); LogEvent("Transitioned to DraggingState"); } public void TransitionToPlacedInSlotState() { _cardContext?.StateMachine.ChangeState("PlacedInSlotState"); LogEvent("Transitioned to PlacedInSlotState"); } public void TransitionToAlbumEnlargedState() { _cardContext?.StateMachine.ChangeState("AlbumEnlargedState"); LogEvent("Transitioned to AlbumEnlargedState"); } #endregion #region Simulation Buttons public void SimulateNewCardFlow() { if (_cardContext == null) return; _cardContext.IsNewCard = true; _cardContext.RepeatCardCount = 0; _cardContext.IsClickable = true; TransitionToIdleState(); LogEvent("Simulating NEW CARD flow - click card to flip"); } public void SimulateRepeatCardFlow() { if (_cardContext == null) return; int repeatCount = Mathf.RoundToInt(repeatCountSlider.value); _cardContext.IsNewCard = false; _cardContext.RepeatCardCount = repeatCount; _cardContext.IsClickable = true; TransitionToIdleState(); LogEvent($"Simulating REPEAT CARD flow ({repeatCount}/5) - click card to flip"); } public void SimulateUpgradeFlow() { if (_cardContext == null) return; _cardContext.IsNewCard = false; _cardContext.RepeatCardCount = 5; // Trigger upgrade _cardContext.IsClickable = true; TransitionToIdleState(); LogEvent("Simulating UPGRADE flow (5/5) - click card to flip and auto-upgrade"); } public void SimulateAlbumPlacementFlow() { if (_cardContext == null) return; _cardContext.IsNewCard = false; _cardContext.RepeatCardCount = 0; TransitionToRevealedState(); LogEvent("Simulating ALBUM PLACEMENT - drag card to slot"); } #endregion #region Card Setup Controls public void ApplyCardSetup() { if (_cardContext == null) return; bool isNew = isNewToggle != null && isNewToggle.isOn; int repeatCount = repeatCountSlider != null ? Mathf.RoundToInt(repeatCountSlider.value) : 0; _cardContext.IsNewCard = isNew; _cardContext.RepeatCardCount = repeatCount; // Apply rarity if needed if (rarityDropdown != null && testCardData != null) { testCardData.Rarity = (CardRarity)rarityDropdown.value; } LogEvent($"Card setup applied: IsNew={isNew}, RepeatCount={repeatCount}"); } private void OnRepeatCountChanged(float value) { if (repeatCountLabel != null) { repeatCountLabel.text = $"{Mathf.RoundToInt(value)}/5"; } } private void OnIsClickableToggled(bool isClickable) { if (_cardContext != null) { _cardContext.IsClickable = isClickable; LogEvent($"Card clickable: {isClickable}"); } } #endregion #region Animation Test Buttons public void PlayFlipAnimation() { // Transition to IdleState and programmatically trigger flip TransitionToIdleState(); // Get IdleState and trigger click var idleState = testCard.GetComponentInChildren(); if (idleState != null) { idleState.OnPointerClick(null); LogEvent("Playing flip animation"); } } public void PlayEnlargeAnimation() { if (_cardContext?.Animator != null) { _cardContext.Animator.PlayEnlarge(2.5f); LogEvent("Playing enlarge animation"); } } public void PlayShrinkAnimation() { if (_cardContext?.Animator != null) { _cardContext.Animator.PlayShrink(Vector3.one, null); LogEvent("Playing shrink animation"); } } public void StartIdleHoverAnimation() { if (_cardContext?.Animator != null) { _cardContext.Animator.StartIdleHover(10f, 1.5f); LogEvent("Started idle hover animation"); } } public void StopIdleHoverAnimation() { // Stopping hover is handled by IdleState's OnDisable LogEvent("Idle hover stopped (change state to stop)"); } #endregion #region Utility Buttons public void ResetCardPosition() { if (testCard != null) { testCard.transform.position = _originalCardPosition; testCard.transform.localScale = Vector3.one; LogEvent("Card position reset"); } } public void ClearEventLog() { _eventLog.Clear(); UpdateEventLog(); LogEvent("Event log cleared"); } #endregion #region Event Handlers private void OnCardFlipComplete(CardContext context) { LogEvent($"Event: OnFlipComplete - IsNew={context.IsNewCard}, RepeatCount={context.RepeatCardCount}"); } private void OnCardDismissed(CardContext context) { LogEvent("Event: OnCardDismissed"); } private void OnCardInteractionComplete(CardContext context) { LogEvent("Event: OnCardInteractionComplete"); } private void OnCardUpgradeTriggered(CardContext context) { LogEvent($"Event: OnUpgradeTriggered - New Rarity={context.CardData?.Rarity}"); } #endregion #region Event Log private void LogEvent(string message) { string timestamp = $"[{Time.time:F2}s]"; _eventLog.Add($"{timestamp} {message}"); // Keep only last 20 events if (_eventLog.Count > 20) { _eventLog.RemoveAt(0); } UpdateEventLog(); Logging.Debug($"[CardTest] {message}"); } private void UpdateEventLog() { if (eventLogText != null) { eventLogText.text = string.Join("\n", _eventLog); } } private void UpdateCurrentStateDisplay() { if (currentStateText != null && _cardContext != null && _cardContext.StateMachine != null) { // Get the active state by checking which child state GameObject is active string stateName = "Unknown"; Transform stateMachineTransform = _cardContext.StateMachine.transform; for (int i = 0; i < stateMachineTransform.childCount; i++) { Transform child = stateMachineTransform.GetChild(i); if (child.gameObject.activeSelf) { stateName = child.name; break; } } currentStateText.text = $"Current State: {stateName}"; } } #endregion private void OnDestroy() { // Unsubscribe from events if (_cardContext != null) { _cardContext.OnFlipComplete -= OnCardFlipComplete; _cardContext.OnCardDismissed -= OnCardDismissed; _cardContext.OnCardInteractionComplete -= OnCardInteractionComplete; _cardContext.OnUpgradeTriggered -= OnCardUpgradeTriggered; } } } }