using PrizeSystem;
using System;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class PrizeView : MonoBehaviour
{
[SerializeField] private Image _image;
[SerializeField] private TextMeshProUGUI _label;
public Prize Prize;
public void SetPrize(Prize prize)
{
if (prize == null || prize is EmptyPrize)
{
_image.sprite = prize is EmptyPrize ? PrizeSystemManager.GetPrizeIcon(PrizeType.None) : null;
_label.text = GetPrizeText(prize);
Prize = prize;
return;
}
_image.sprite = PrizeSystemManager.GetPrizeIcon(prize.PrizeType);
_label.text = GetText(prize);
_label.rectTransform.sizeDelta = new Vector2(_label.preferredWidth, _label.rectTransform.sizeDelta.y);
Prize = prize;
}
public void Clear()
{
_image.sprite = null;
_label.text = "";
Prize = null;
}
private string GetText(Prize prize) => GetPrizeText(prize);
public static string GetPrizeText(Prize prize)
{
if (prize == null || prize is EmptyPrize)
{
return "Пусто";
}
else if (prize is CountablePrize cp)
{
return prize.PrizeType switch
{
PrizeType.Hopper => $"{cp.Amount} {Pluralize(cp.Amount, "маленький приз", "маленьких приза", "маленьких призов")}",
PrizeType.Ticket => $"{cp.Amount} {Pluralize(cp.Amount, "билет", "билета", "билетов")}",
PrizeType.Marbles => $"{cp.Amount} марблс",
_ => "Приз"
};
}
else if (prize is VitrinaPrize vp)
{
return $"Витрина ячейки: {string.Join(" | ", vp.Boxes)}";
}
else if (prize is QrPrize qp)
{
return $"QR: {qp.PrizeText}";
}
return "";
}
///
/// Возвращает правильную форму существительного для русского языка в зависимости от числа
///
/// Количество предметов
/// Форма для 1 (именительный падеж, ед.ч.): "яблоко"
/// Форма для 2-4 (родительный падеж, ед.ч.): "яблока"
/// Форма для 5+ (родительный падеж, мн.ч.): "яблок"
/// Правильная форма существительного
public static string Pluralize(int count, string form1, string form2, string form3)
{
// Приводим число к положительному виду для корректной работы с остатками
int absCount = Mathf.Abs(count);
// Определяем остатки для проверки правил
long lastTwoDigits = absCount % 100;
long lastDigit = absCount % 10;
// Особый случай: числа от 11 до 19 всегда используют форму 3
if (lastTwoDigits >= 11 && lastTwoDigits <= 19)
{
return form3;
}
// Обычные правила склонения
switch (lastDigit)
{
case 1:
return form1;
case 2:
case 3:
case 4:
return form2;
default:
return form3;
}
}
}