using System;
using AppleHills.Data.CardSystem;
using Core.SaveLoad;
using UnityEngine;
namespace UI.CardSystem.StateMachine
{
///
/// Shared context for card states.
/// Provides access to common components and data that states need.
///
public class CardContext : MonoBehaviour
{
[Header("Core Components")]
[SerializeField] private CardDisplay cardDisplay;
[SerializeField] private CardAnimator cardAnimator;
private AppleMachine stateMachine;
[Header("Card Data")]
private CardData cardData;
// Public accessors
public CardDisplay CardDisplay => cardDisplay;
public CardAnimator Animator => cardAnimator;
public AppleMachine StateMachine => stateMachine;
public Transform RootTransform => transform;
public CardData CardData => cardData;
// Runtime state
public bool IsNewCard { get; set; }
public int RepeatCardCount { get; set; }
// Events for external coordination (BoosterOpeningPage, etc.)
public event Action OnFlipComplete;
public event Action OnCardDismissed;
public event Action OnCardInteractionComplete;
public event Action OnUpgradeTriggered;
// Helper methods for states
public void FireFlipComplete() => OnFlipComplete?.Invoke(this);
public void FireCardDismissed() => OnCardDismissed?.Invoke(this);
public void FireCardInteractionComplete() => OnCardInteractionComplete?.Invoke(this);
public void FireUpgradeTriggered() => OnUpgradeTriggered?.Invoke(this);
private void Awake()
{
// Auto-find components if not assigned
if (cardDisplay == null)
cardDisplay = GetComponentInChildren();
if (cardAnimator == null)
cardAnimator = GetComponent();
if (stateMachine == null)
stateMachine = GetComponentInChildren();
}
///
/// Setup the card with data
///
public void SetupCard(CardData data, bool isNew = false, int repeatCount = 0)
{
cardData = data;
IsNewCard = isNew;
RepeatCardCount = repeatCount;
if (cardDisplay != null)
{
cardDisplay.SetupCard(data);
}
}
///
/// Get the card display component
///
public CardDisplay GetCardDisplay() => cardDisplay;
}
}