using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using RR.Common.Prizes;
using RR.Common.Managers;
using RR.Common.UI.FX;
using RR.Game2D.Core.Managers;
namespace RR.Common.UI
{
///
/// Модальное окно для отображения QR-кодов.
/// Создаёт Image-объекты с QR-кодами динамически в указанном контейнере.
///
public class QRCodeModal : Modal
{
/// Текущий экземпляр на сцене. Регистрируется автоматически.
public static QRCodeModal Current { get; private set; }
[Header("Контент")]
[Tooltip("Контейнер для размещения QR-кодов. QR-коды создаются динамически.")]
[SerializeField] private RectTransform qrCodesContainer;
[Tooltip("Текст для показа названия приза. Если не назначен, можно оставить пустым.")]
[SerializeField] private TMP_Text prizeText;
[Tooltip("Шаблон текста приза. Если содержит '{0}', он будет заменён на название приза. Иначе значение считается токеном для замены внутри текста TMP.")]
[SerializeField] private string prizeTextTemplatePlaceholder = "{0}";
private readonly List _createdObjects = new();
private string _defaultPrizeTextTemplate;
private bool _defaultPrizeTextActive;
protected override void Awake()
{
Current = this;
base.Awake(); // деактивирует GO, но ссылка Current остаётся валидной
if (prizeText != null)
{
_defaultPrizeTextTemplate = prizeText.text;
_defaultPrizeTextActive = prizeText.gameObject.activeSelf;
}
}
private void OnDestroy()
{
if (Current == this) Current = null;
}
///
/// Показывает модальное окно с указанными QR-кодами.
///
/// Массив текстур QR-кодов для отображения.
public void ShowQRCodes(Texture2D[] qrTextures, QRTier tier, float gameTime, int finalScore, bool showFinalScore)
{
ClearQRCodes();
if (qrCodesContainer == null)
{
Debug.LogWarning("[QRCodeModal] Контейнер для QR-кодов не назначен.");
return;
}
if (qrTextures == null || qrTextures.Length == 0)
{
Debug.LogWarning("[QRCodeModal] Нет QR-кодов для отображения.");
return;
}
foreach (Texture2D tex in qrTextures)
{
if (tex == null) continue;
GameObject qrObj = new GameObject("QRCode", typeof(RectTransform), typeof(Image));
qrObj.transform.SetParent(qrCodesContainer, false);
Sprite sprite = Sprite.Create(
tex,
new Rect(0, 0, tex.width, tex.height),
new Vector2(0.5f, 0.5f));
Image image = qrObj.GetComponent();
image.sprite = sprite;
image.raycastTarget = false;
QRCodeTierHighlight.Apply(qrObj, tier);
_createdObjects.Add(qrObj);
}
UpdatePrizeText(tier);
Open();
GameManager.Instance?.SetPause(true);
}
///
/// Очищает созданные QR-код объекты.
///
private void ClearQRCodes()
{
foreach (GameObject obj in _createdObjects)
{
if (obj != null) Destroy(obj);
}
_createdObjects.Clear();
}
public override void Close()
{
base.Close();
ClearQRCodes();
ResetPrizeText();
GameManager.Instance?.SetPause(false);
}
protected override void OnDisable()
{
base.OnDisable();
ClearQRCodes();
ResetPrizeText();
GameManager.Instance?.SetPause(false);
}
private void UpdatePrizeText(QRTier tier)
{
if (prizeText == null)
{
return;
}
PrizeSystemManager prizeSystemManager = PrizeSystemManager.Instance;
string prizeLine = prizeSystemManager != null
? prizeSystemManager.GetQRCodeModalPrizeText(tier)
: string.Empty;
bool hasPrizeLine = !string.IsNullOrWhiteSpace(prizeLine);
prizeText.gameObject.SetActive(hasPrizeLine);
if (hasPrizeLine)
{
prizeText.text = ApplyPrizeTextTemplate(prizeLine);
}
}
private void ResetPrizeText()
{
if (prizeText == null)
{
return;
}
prizeText.text = _defaultPrizeTextTemplate;
prizeText.gameObject.SetActive(_defaultPrizeTextActive);
}
private string ApplyPrizeTextTemplate(string prizeLine)
{
if (!string.IsNullOrWhiteSpace(prizeTextTemplatePlaceholder) &&
prizeTextTemplatePlaceholder.Contains("{0}"))
{
return prizeTextTemplatePlaceholder.Replace("{0}", prizeLine);
}
string template = _defaultPrizeTextTemplate;
if (string.IsNullOrWhiteSpace(template) && prizeText != null)
{
template = prizeText.text;
}
if (string.IsNullOrWhiteSpace(template))
{
return prizeLine;
}
if (!string.IsNullOrEmpty(prizeTextTemplatePlaceholder) &&
template.Contains(prizeTextTemplatePlaceholder))
{
return template.Replace(prizeTextTemplatePlaceholder, prizeLine);
}
if (template.Contains("{0}"))
{
return template.Replace("{0}", prizeLine);
}
string trimmedTemplate = template.TrimEnd();
if (trimmedTemplate.EndsWith(":") || trimmedTemplate.EndsWith("-"))
{
return $"{template} {prizeLine}".Trim();
}
return prizeLine;
}
}
}