using TMPro;
using UnityEngine;
namespace UI
{
///
/// Управляет только TextMeshPro текстом с контактами администрации.
/// Подписывается на изменения настроек и обновляет текст, беря номер из PlayerPrefs по ключу `telephone_number`.
///
public class AdminContactsController : MonoBehaviour
{
[Tooltip("TextMeshPro текст, куда выводятся контакты администрации.")]
[SerializeField] private TMP_Text contactsText;
[Tooltip("TextMeshPro текст для отображения ошибок выдачи приза.")]
[SerializeField] private TMP_Text errorText;
[Tooltip("TextMeshPro текст для отображения суперприза.")]
[SerializeField] private TMP_Text prizeText;
[Tooltip("TextMeshPro текст для отображения цены игры с ботом.")]
[SerializeField] private TMP_Text priceBotText;
[Tooltip("TextMeshPro текст для отображения цены игры с другом.")]
[SerializeField] private TMP_Text pricePlayerText;
[Tooltip("Ключ PlayerPrefs, откуда берётся номер телефона (по умолчанию 'telephone_number').")]
[SerializeField] private string telephonePrefKey = "telephone_number";
[Tooltip("Ключ PlayerPrefs, откуда берётся приз (по умолчанию 'SpecialPrize').")]
[SerializeField] private string prizePrefKey = "SpecialPrize";
[Tooltip("Если true — объект текста будет скрываться, когда опция выключена; иначе текст будет очищаться.")]
[SerializeField] private bool hideTextWhenOff = true;
private const string SettingName = "Показывать контакты администрации";
private const string ErrorSettingName = "Вывод ошибки выдачи в меню";
private const string PrizeSettingName = "Вывод информации о суперпризе в меню";
private const string PriceSettingName = "Показывать цену игры";
private void OnEnable()
{
if (SettingsManager.instance != null)
SettingsManager.instance.OnSettingsChanged.AddListener(UpdateState);
TextInput.OnTextChanged += UpdateState;
}
private void Start()
{
if (contactsText == null)
contactsText = GetComponent();
// Если errorText не назначен в инспекторе, пытаемся найти его среди дочерних TMP-текств
if (errorText == null)
{
var tmps = GetComponentsInChildren(true);
foreach (var t in tmps)
{
if (t == contactsText) continue;
errorText = t;
break;
}
}
// Подстраховка: подпишемся также в Start, если instance появился позже
if (SettingsManager.instance != null)
{
SettingsManager.instance.OnSettingsChanged.RemoveListener(UpdateState);
SettingsManager.instance.OnSettingsChanged.AddListener(UpdateState);
}
UpdateState();
}
private void OnDisable()
{
if (SettingsManager.instance != null)
SettingsManager.instance.OnSettingsChanged.RemoveListener(UpdateState);
// Отписываемся от изменения текста (если подписывались в OnEnable)
TextInput.OnTextChanged -= UpdateState;
}
private void UpdateState()
{
// Обновляем contactsText независимо от errorText
bool contactsShouldShow = GetSettingFlag(SettingName);
if (contactsText != null)
{
if (contactsShouldShow)
{
contactsText.gameObject.SetActive(true);
string phone = PlayerPrefs.GetString(telephonePrefKey, string.Empty);
contactsText.text = string.IsNullOrEmpty(phone) ? "Телефон не задан" : $"Телефон: {phone}";
}
else
{
if (hideTextWhenOff)
contactsText.gameObject.SetActive(false);
else
contactsText.text = string.Empty;
}
}
// Обновляем errorText независимо от contactsText
bool showError = GetSettingFlag(ErrorSettingName);
if (errorText != null)
{
if (showError)
{
errorText.gameObject.SetActive(true);
string err = PlayerPrefs.GetString(KeyVault.PRIZING_ERROR_REGISTRED, string.Empty);
if (string.IsNullOrEmpty(err))
{
errorText.text = "";
errorText.color = Color.green; // нет ошибок — зелёный
}
else
{
errorText.text = $"Ошибка выдачи {err}";
errorText.color = Color.red; // есть ошибка — красный
}
}
else
{
if (hideTextWhenOff)
errorText.gameObject.SetActive(false);
else
errorText.text = string.Empty;
}
}
bool showPrize = GetSettingFlag(PrizeSettingName);
if (prizeText != null)
{
if (showPrize)
{
prizeText.gameObject.SetActive(true);
string prizeInfo = PlayerPrefs.GetString(prizePrefKey, string.Empty);
prizeText.text = string.IsNullOrEmpty(prizeInfo) ? "Суперприз не задан" : $"Суперприз: {prizeInfo}";
}
else
{
if (hideTextWhenOff)
prizeText.gameObject.SetActive(false);
else
prizeText.text = string.Empty;
}
}
bool showPrice = GetSettingFlag(PriceSettingName);
if (priceBotText != null)
{
if (showPrice)
{
priceBotText.gameObject.SetActive(true);
string price = PlayerPrefs.GetString("PriceBotGame", string.Empty);
priceBotText.text = string.IsNullOrEmpty(price) ? "Цена игры с ботом не задана" : $"{price} р";
}
else
{
if (hideTextWhenOff)
priceBotText.gameObject.SetActive(false);
else
priceBotText.text = string.Empty;
}
}
if (pricePlayerText != null)
{
if (showPrice)
{
pricePlayerText.gameObject.SetActive(true);
string price = PlayerPrefs.GetString("PricePlayerGame", string.Empty);
pricePlayerText.text = string.IsNullOrEmpty(price) ? "Цена игры с другом не задана" : $"{price} р";
}
else
{
if (hideTextWhenOff)
pricePlayerText.gameObject.SetActive(false);
else
pricePlayerText.text = string.Empty;
}
}
}
// Универсальная проверка булевых настроек (учитывает разные представления true)
private bool GetSettingFlag(string key)
{
if (SettingsManager.instance == null) return false;
string val;
try { val = SettingsManager.instance.GetSettingValue(key); }
catch (System.Exception ex)
{
Debug.LogWarning($"AdminContactsController: ошибка при чтении настройки '{key}': {ex.Message}");
return false;
}
if (string.IsNullOrEmpty(val)) return false;
val = val.Trim().ToLowerInvariant();
string[] trueValues = new string[] { "вкл", "включено", "да", "true", "on", "enabled", "вкл." };
foreach (var t in trueValues)
if (val.Contains(t)) return true;
return false;
}
}
}