using Core; using Core.SaveLoad; using UnityEngine; namespace UI.CardSystem.StateMachine.States { /// /// Card is in pending face-down state in corner, awaiting drag. /// On drag start, triggers flip animation and transitions to revealed dragging. /// public class CardPendingFaceDownState : AppleState, ICardStateDragHandler { [Header("State-Owned Visuals")] [SerializeField] private GameObject cardBackVisual; private CardContext _context; private bool _isFlipping; private void Awake() { _context = GetComponentInParent(); } public override void OnEnterState() { if (_context == null) return; _isFlipping = false; // Show card back, hide card front if (cardBackVisual != null) { cardBackVisual.SetActive(true); cardBackVisual.transform.localRotation = Quaternion.Euler(0, 0, 0); } if (_context.CardDisplay != null) { _context.CardDisplay.gameObject.SetActive(false); _context.CardDisplay.transform.localRotation = Quaternion.Euler(0, 180, 0); } // Scale down for corner display _context.RootTransform.localScale = _context.OriginalScale * 0.8f; } /// /// Handle drag start - triggers flip animation and page navigation /// public bool OnCardDragStarted(CardContext context) { if (_isFlipping) return true; // Already handling // IMPORTANT: Data must be assigned by event listeners (AlbumViewPage) BEFORE we flip // The event system guarantees this because events are synchronous if (context.CardData == null) { Logging.Warning("[CardPendingFaceDownState] OnCardDragStarted called but no CardData assigned yet!"); return true; // Don't flip without data } // Start flip animation (data is now guaranteed to be assigned) StartFlipAnimation(); return true; // We handled it, prevent default DraggingState transition } /// /// We don't handle drag end in face-down state /// public bool OnCardDragEnded(CardContext context) { return false; } private void StartFlipAnimation() { _isFlipping = true; // Scale up from corner size to normal dragging size if (_context.Animator != null) { _context.Animator.AnimateScale(_context.OriginalScale * 1.15f, 0.3f); } // Play flip animation if (_context.Animator != null) { _context.Animator.PlayFlip( cardBack: cardBackVisual != null ? cardBackVisual.transform : null, cardFront: _context.CardDisplay != null ? _context.CardDisplay.transform : null, onComplete: OnFlipComplete ); } else { // No animator, just switch visibility immediately if (cardBackVisual != null) cardBackVisual.SetActive(false); if (_context.CardDisplay != null) _context.CardDisplay.gameObject.SetActive(true); OnFlipComplete(); } } private void OnFlipComplete() { // Transition to dragging revealed state _context.StateMachine.ChangeState("DraggingRevealedState"); } private void OnDisable() { // Hide card back when leaving state if (cardBackVisual != null) { cardBackVisual.SetActive(false); } } } }