using System.Collections.Generic;
using System.IO;
using UnityEngine;
namespace RR.Common.Prizes
{
///
/// Хранилище призов за уровни. Загружает и сохраняет конфигурацию в JSON-файл.
/// Если файла нет — создаёт новый с пустым списком (нет призов ни за один уровень).
///
public class PrizeDatabase
{
private const string FileName = "prizes.json";
private readonly Dictionary _configs = new();
private string _filePath;
/// Путь к JSON-файлу.
public string FilePath => _filePath;
// ────────────── Загрузка / сохранение ──────────────
///
/// Загружает конфигурацию из JSON-файла рядом с исполняемым файлом.
/// Если файл отсутствует — создаёт пустой.
///
public void Load()
{
string root = Directory.GetParent(Application.dataPath)?.ToString()
?? Application.dataPath;
_filePath = Path.Combine(root, FileName);
_configs.Clear();
if (File.Exists(_filePath))
{
string json = File.ReadAllText(_filePath);
var data = JsonUtility.FromJson(json);
if (data?.levels != null)
{
foreach (PrizeLevelEntry entry in data.levels)
{
if (!string.IsNullOrEmpty(entry.level))
_configs[entry.level] = entry.config ?? new LevelPrizeConfig();
}
}
Debug.Log($"[PrizeDatabase] Загружено {_configs.Count} записей из {_filePath}");
}
else
{
Save();
Debug.Log($"[PrizeDatabase] Файл не найден — создан пустой: {_filePath}");
}
}
///
/// Сохраняет текущую конфигурацию в JSON-файл.
///
public void Save()
{
if (string.IsNullOrEmpty(_filePath)) return;
var data = new PrizesFileData();
foreach (var kvp in _configs)
data.levels.Add(new PrizeLevelEntry { level = kvp.Key, config = kvp.Value });
string json = JsonUtility.ToJson(data, true);
File.WriteAllText(_filePath, json);
Debug.Log($"[PrizeDatabase] Сохранено {_configs.Count} записей в {_filePath}");
}
// ────────────── Чтение ──────────────
///
/// Возвращает конфигурацию приза для указанного уровня.
/// Если для уровня нет записи — возвращает .
///
public LevelPrizeConfig GetConfig(string level)
{
return _configs.TryGetValue(level, out var config) ? config : new LevelPrizeConfig();
}
///
/// Проверяет, есть ли запись для указанного уровня.
///
public bool HasConfig(string level) => _configs.ContainsKey(level);
///
/// Все записи (только для чтения).
///
public IReadOnlyDictionary GetAll() => _configs;
// ────────────── Запись ──────────────
///
/// Устанавливает конфигурацию приза для уровня и сохраняет файл.
///
public void SetConfig(string level, LevelPrizeConfig config)
{
_configs[level] = config;
Save();
}
///
/// Удаляет запись для уровня (приз = None) и сохраняет файл.
///
public void RemoveConfig(string level)
{
if (_configs.Remove(level))
Save();
}
///
/// Очищает все записи и сохраняет пустой файл.
///
public void Clear()
{
_configs.Clear();
Save();
}
}
}