using System; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using YachtDice.Modifiers.Core; using YachtDice.Modifiers.Definition; namespace YachtDice.Shop { public class ShopItemView : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler { [SerializeField] private Image iconImage; [SerializeField] private TMP_Text nameText; [SerializeField] private TMP_Text descriptionText; [SerializeField] private TMP_Text priceText; [SerializeField] private TMP_Text rarityText; [SerializeField] private Button buyButton; [SerializeField] private TMP_Text buyButtonText; [SerializeField] private Image background; [Header("Rarity Colors")] [SerializeField] private Color commonColor = Color.white; [SerializeField] private Color uncommonColor = new(0.4f, 0.8f, 0.4f); [SerializeField] private Color rareColor = new(0.4f, 0.6f, 1f); [SerializeField] private Color epicColor = new(0.8f, 0.4f, 1f); private IShopItem _data; public event Action OnBuyClicked; public event Action OnHoverEnter; public event Action OnHoverExit; private void Awake() { if (buyButton != null) buyButton.onClick.AddListener(() => OnBuyClicked?.Invoke(_data)); } public void Setup(IShopItem item, ShopItemState state) { _data = item; if (nameText != null) nameText.text = _data.DisplayName; if (descriptionText != null) descriptionText.text = _data.Description; if (priceText != null) priceText.text = _data.ShopPrice.ToString(); if (iconImage != null && _data.Icon != null) iconImage.sprite = _data.Icon; if (rarityText != null) { if (_data is ModifierDefinition mod) { rarityText.gameObject.SetActive(true); rarityText.text = mod.Rarity.ToString(); rarityText.color = GetRarityColor(mod.Rarity); } else { rarityText.gameObject.SetActive(false); } } SetState(state); } public void SetState(ShopItemState state) { if (buyButton == null) return; switch (state) { case ShopItemState.Available: buyButton.interactable = true; if (buyButtonText != null) buyButtonText.text = "Buy"; break; case ShopItemState.RepurchaseAvailable: buyButton.interactable = true; if (buyButtonText != null) buyButtonText.text = "Buy"; break; case ShopItemState.TooExpensive: buyButton.interactable = false; if (buyButtonText != null) buyButtonText.text = "Buy"; break; case ShopItemState.Owned: buyButton.interactable = false; if (buyButtonText != null) buyButtonText.text = "Owned"; break; } } public void OnPointerEnter(PointerEventData eventData) { OnHoverEnter?.Invoke(_data, transform as RectTransform); } public void OnPointerExit(PointerEventData eventData) { OnHoverExit?.Invoke(); } private Color GetRarityColor(ModifierRarity rarity) { return rarity switch { ModifierRarity.Common => commonColor, ModifierRarity.Uncommon => uncommonColor, ModifierRarity.Rare => rareColor, ModifierRarity.Epic => epicColor, _ => commonColor }; } } }