using RR.Common.Behaviour.ScriptableObjects;
using RR.Common.Controls;
using RR.Game2D.Core.Managers;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
namespace RR.Common.Managers
{
///
/// Менеджер системы оплаты. Управляет кредитами и интегрируется с ComWrapper.
///
public class PaymentManager : MonoBehaviour
{
public static PaymentManager Instance { get; private set; }
[Header("Настройки")]
[SerializeField] private bool saveMoneyBetweenSessions = false;
[SerializeField] private bool enableFreeGame = false;
[Header("Управление")]
[SerializeField] private InputActionReference addCreditAction;
[Header("Состояние")]
public int CreditsCount { get; private set; }
// События для уведомления других систем
public UnityEvent OnCreditsChanged;
public UnityEvent OnCreditAdded;
public UnityEvent OnCreditRemoved;
#region Unity Lifetime
public void Initialize()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
// Инициализация событий
OnCreditsChanged ??= new UnityEvent();
OnCreditAdded ??= new UnityEvent();
OnCreditRemoved ??= new UnityEvent();
// Загрузка кредитов из сохранений
if (!saveMoneyBetweenSessions)
{
PlayerPrefs.SetInt("CoinsCount", 0);
}
CreditsCount = PlayerPrefs.GetInt("CoinsCount", 0);
// Подписка на события ComWrapper
ComWrapper.OnCreditAdded?.AddListener(HandleCreditAdded);
ComWrapper.OnCreditRemoved?.AddListener(HandleCreditRemoved);
// Привязка действия добавления кредита (для тестирования)
if (addCreditAction != null)
{
addCreditAction.action.performed += AddCreditsManually;
addCreditAction.action.Enable();
}
SettingsManager manager = SettingsManager.Instance;
if (manager != null)
{
manager.OnSettingsLoaded += SetFreePlay;
manager.OnSettingsSaved += SetFreePlay;
}
Debug.Log($"Инициализирован. Кредиты: {CreditsCount}, Бесплатная игра: {enableFreeGame}", this);
}
// Если не инициализируется в GameManager, инициализировать тут
// private void Awake()
// {
// Initialize();
// }
private void OnDestroy()
{
// Отписка от событий ComWrapper
ComWrapper.OnCreditAdded?.RemoveListener(HandleCreditAdded);
ComWrapper.OnCreditRemoved?.RemoveListener(HandleCreditRemoved);
// Отключение действия добавления кредита
if (addCreditAction == null) return;
addCreditAction.action.performed -= AddCreditsManually;
addCreditAction.action.Disable();
SettingsManager manager = SettingsManager.Instance;
if (manager == null) return;
manager.OnSettingsLoaded -= SetFreePlay;
manager.OnSettingsSaved -= SetFreePlay;
}
#endregion
#region Private Methods
///
/// Обработчик добавления кредита из ComWrapper
///
/// Новое количество кредитов
private void HandleCreditAdded(int newCreditsCount)
{
CreditsCount = newCreditsCount;
OnCreditsChanged?.Invoke(CreditsCount);
OnCreditAdded?.Invoke(CreditsCount);
Debug.Log($"Кредит добавлен. Всего: {CreditsCount}", this);
}
///
/// Обработчик удаления кредита из ComWrapper
///
/// Новое количество кредитов
private void HandleCreditRemoved(int newCreditsCount)
{
CreditsCount = newCreditsCount;
OnCreditsChanged?.Invoke(CreditsCount);
OnCreditRemoved?.Invoke(CreditsCount);
Debug.Log($"Кредит удален. Осталось: {CreditsCount}", this);
}
private void SetFreePlay()
{
if (SettingsManager.Instance == null) return;
GameSettings currentSettings = SettingsManager.Instance.GetCurrentGameSettings();
enableFreeGame = currentSettings.isFreeGame;
Debug.Log($"Бесплатная игра установлена из настроек: {enableFreeGame}", this);
}
#endregion
#region Public API
///
/// Проверяет, может ли игрок начать игру (есть ли кредиты или включена бесплатная игра)
///
/// true если игрок может начать игру
public bool CanStartGame()
{
if (enableFreeGame)
{
GameManager.Logger?.Log("PaymentManager", "Бесплатная игра включена");
return true;
}
bool canStart = CreditsCount > 0;
GameManager.Logger?.Log("PaymentManager", $"Проверка возможности старта: {canStart} (кредиты: {CreditsCount})");
return canStart;
}
///
/// Выполняет списание платы за запуск игры через ComWrapper.Pay()
///
/// true если оплата прошла успешно
public bool ProcessPayment(int amount = 1)
{
if (enableFreeGame)
{
GameManager.Logger?.Log("PaymentManager", "Оплата пропущена - бесплатная игра");
return true;
}
bool paymentSuccess = ComWrapper.Pay(amount);
Debug.Log(paymentSuccess ? "Оплата успешна" : "Оплата не прошла - недостаточно кредитов", this);
return paymentSuccess;
}
///
/// Добавляет кредиты вручную (для тестирования)
///
/// Количество кредитов
public static void AddCreditsManually(int amount = 1)
{
for (int i = 0; i < amount; i++)
{
ComWrapper.AddCredit();
}
}
private static void AddCreditsManually(InputAction.CallbackContext context)
{
AddCreditsManually();
// OnCreditAdded?.Invoke(CreditsCount);
// OnCreditsChanged?.Invoke(CreditsCount);
}
///
/// Включает/выключает режим бесплатной игры
///
/// Включить/выключить
public void SetFreePlayMode(bool enable)
{
enableFreeGame = enable;
GameManager.Logger?.Log("PaymentManager", $"Бесплатная игра: {enableFreeGame}");
}
///
/// Получить текущее состояние режима бесплатной игры
///
public bool IsFreePlayEnabled() => enableFreeGame;
public void SetFreePlay(bool freePlayEnabled)
{
enableFreeGame = freePlayEnabled;
}
#endregion
}
}