using System;
using UnityEngine;
using UnityEngine.UI;
using Vanguard.Api.Contracts;
namespace Vanguard.UI.Overlays
{
/// Крупная карточка с полным текстом. Для скрытых карт показывает рубашку.
public sealed class CardDetailOverlay
{
private readonly RectTransform _root;
private readonly Image _art;
private readonly Text _name;
private readonly Text _meta;
private readonly Text _stats;
private readonly Text _ability;
private readonly Func _catalog;
private Action _onBack;
public CardDetailOverlay(
Transform parent,
Func catalog)
{
_catalog = catalog;
_root = UiKit.CreatePanel(parent, "CardDetailOverlay", new Color(0f, 0f, 0f, 0.82f));
var panel = UiKit.CreateCenteredCard(
_root,
"CardDetailPanel",
new Vector2(900f, 600f),
new Color(0.045f, 0.06f, 0.09f, 1f));
UiKit.AddVerticalLayout(panel, 16, 10);
var header = UiKit.CreatePanel(panel, "Header", Color.clear);
UiKit.AddHorizontalLayout(header, 0, 10);
UiKit.SetPreferredHeight(header, 44f);
_name = UiKit.CreateText(header, "Name", "Карта", 24, Color.white, TextAnchor.MiddleLeft);
_name.fontStyle = FontStyle.Bold;
UiKit.MakeLiteral(_name);
UiKit.SetPreferredHeight(_name, 44f);
var back = UiKit.CreateButton(header, "Back", "Назад", () => _onBack?.Invoke(), 16);
var backElement = UiKit.SetPreferredHeight(back, 40f, 0f);
backElement.preferredWidth = 110f;
var close = UiKit.CreateButton(header, "Close", "Закрыть", () => _onBack?.Invoke(), 16);
var closeElement = UiKit.SetPreferredHeight(close, 40f, 0f);
closeElement.preferredWidth = 110f;
var body = UiKit.CreatePanel(panel, "Body", Color.clear);
var bodyElement = body.gameObject.AddComponent();
bodyElement.flexibleHeight = 1f;
bodyElement.minHeight = 500f;
UiKit.AddHorizontalLayout(body, 0, 16);
var artPanel = UiKit.CreatePanel(body, "Art", Color.white);
var artElement = artPanel.gameObject.AddComponent();
artElement.preferredWidth = 300f;
artElement.preferredHeight = 460f;
artElement.flexibleWidth = 0f;
_art = artPanel.GetComponent();
_art.raycastTarget = false;
var info = UiKit.CreatePanel(body, "Info", Color.clear);
var infoElement = info.gameObject.AddComponent();
infoElement.flexibleWidth = 1f;
infoElement.flexibleHeight = 1f;
UiKit.AddVerticalLayout(info, 0, 6);
_meta = UiKit.CreateText(info, "Meta", string.Empty, 15, new Color(0.72f, 0.80f, 0.94f), TextAnchor.UpperLeft);
_meta.horizontalOverflow = HorizontalWrapMode.Wrap;
UiKit.MakeLiteral(_meta);
UiKit.SetPreferredHeight(_meta, 52f);
_stats = UiKit.CreateText(info, "Stats", string.Empty, 17, Color.white, TextAnchor.UpperLeft);
_stats.fontStyle = FontStyle.Bold;
UiKit.MakeLiteral(_stats);
UiKit.SetPreferredHeight(_stats, 40f);
_ability = UiKit.CreateText(info, "Ability", string.Empty, 15, Color.white, TextAnchor.UpperLeft);
_ability.horizontalOverflow = HorizontalWrapMode.Wrap;
_ability.verticalOverflow = VerticalWrapMode.Overflow;
UiKit.MakeLiteral(_ability);
UiKit.SetPreferredHeight(_ability, 300f);
_root.gameObject.SetActive(false);
}
public bool IsVisible => _root.gameObject.activeSelf;
public void Show(CardListEntry entry, Action onBack)
{
_onBack = onBack;
var card = entry.Card;
var meta = card != null ? _catalog?.Invoke(card.PrintingId) : null;
if (entry.Hidden || card == null)
{
_art.sprite = CardArt.Back;
_art.color = Color.white;
_name.text = entry.Label ?? "Закрытая карта";
_meta.text = "Содержимое этой карты скрыто.";
_stats.text = string.Empty;
_ability.text = string.Empty;
}
else
{
CardImageService.Apply(
_art,
meta != null ? meta.ImageKey : null,
CardArt.ForCard(
meta != null ? meta.NameId : card.PrintingId,
meta != null ? meta.Clan : "None"));
_name.text = meta != null ? Loc.CardName(meta) : card.PrintingId;
_meta.text = meta != null
? meta.Clan + " · " + meta.Type + " · G" + meta.Grade
+ (string.IsNullOrEmpty(meta.Trigger) || meta.Trigger == "None"
? string.Empty
: " · " + meta.Trigger)
: string.Empty;
_stats.text = "P " + card.Power
+ " · Shield " + (meta != null ? meta.Shield : 0)
+ " · C " + card.Critical;
_ability.text = meta != null ? Loc.CardText(meta) : string.Empty;
}
_root.SetAsLastSibling();
_root.gameObject.SetActive(true);
}
public void Hide()
{
_root.gameObject.SetActive(false);
}
}
}