using System.Collections.Generic;
using System.IO;
using UnityEngine;
using RR.Common.Utility;
namespace RR.Common.Prizes
{
///
/// Хранилище призов за уровни. Загружает и сохраняет конфигурацию в JSON-файл.
/// Если файла нет — создаёт новый с пустым списком (нет призов ни за один уровень).
///
public class PrizeDatabase
{
private const string FileName = "prizes.json";
private readonly Dictionary _configs = new();
private PrizeStandSettings _prizeStandSettings = new();
private List _qrCodes = new();
private bool _hasStoredQRCodes;
private string _filePath;
/// Путь к JSON-файлу.
public string FilePath => _filePath;
/// Глобальные настройки витрины.
public PrizeStandSettings PrizeStandSettings => _prizeStandSettings;
public bool HasStoredQRCodes => _hasStoredQRCodes;
// ────────────── Загрузка / сохранение ──────────────
///
/// Загружает конфигурацию из JSON-файла рядом с исполняемым файлом.
/// Если файл отсутствует — создаёт пустой.
///
public void Load()
{
string root = Directory.GetParent(Application.dataPath)?.ToString()
?? Application.dataPath;
_filePath = Path.Combine(root, FileName);
_configs.Clear();
_prizeStandSettings = new PrizeStandSettings();
_qrCodes = new List();
_hasStoredQRCodes = false;
if (File.Exists(_filePath))
{
string json = File.ReadAllText(_filePath);
var data = JsonUtility.FromJson(json);
_prizeStandSettings = data?.prizeStandSettings ?? new PrizeStandSettings();
_qrCodes = data?.qrCodes != null ? new List(data.qrCodes) : new List();
_hasStoredQRCodes = data?.qrCodes != null;
NormalizePrizeStandSettings();
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();
_hasStoredQRCodes = false;
Debug.Log($"[PrizeDatabase] Файл не найден — создан пустой: {_filePath}");
}
}
///
/// Сохраняет текущую конфигурацию в JSON-файл.
///
public void Save()
{
if (string.IsNullOrEmpty(_filePath)) return;
var data = new PrizesFileData();
data.prizeStandSettings = _prizeStandSettings ?? new PrizeStandSettings();
data.qrCodes = _qrCodes != null ? new List(_qrCodes) : new List();
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);
_hasStoredQRCodes = true;
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 PrizeStandSettings GetPrizeStandSettings()
{
NormalizePrizeStandSettings();
return _prizeStandSettings;
}
public List GetQRCodes()
{
return _qrCodes != null ? new List(_qrCodes) : new List();
}
// ────────────── Запись ──────────────
///
/// Устанавливает конфигурацию приза для уровня и сохраняет файл.
///
public void SetConfig(string level, LevelPrizeConfig config)
{
_configs[level] = config;
Save();
}
///
/// Удаляет запись для уровня (приз = None) и сохраняет файл.
///
public void RemoveConfig(string level)
{
if (_configs.Remove(level))
Save();
}
///
/// Сохраняет глобальные настройки витрины.
///
public void SetPrizeStandSettings(PrizeStandSettings settings)
{
_prizeStandSettings = settings ?? new PrizeStandSettings();
NormalizePrizeStandSettings();
Save();
}
public void SetQRCodes(List qrCodes)
{
_qrCodes = qrCodes != null ? new List(qrCodes) : new List();
Save();
}
///
/// Очищает все записи и сохраняет пустой файл.
///
public void Clear()
{
_configs.Clear();
_prizeStandSettings = new PrizeStandSettings();
_qrCodes = new List();
Save();
}
private void NormalizePrizeStandSettings()
{
_prizeStandSettings ??= new PrizeStandSettings();
_prizeStandSettings.boxes ??= new List();
_prizeStandSettings.boxes.Sort((a, b) => a.boxNumber.CompareTo(b.boxNumber));
for (int i = _prizeStandSettings.boxes.Count - 1; i >= 0; i--)
{
PrizeStandBoxConfig box = _prizeStandSettings.boxes[i];
if (box == null || box.boxNumber <= 0)
_prizeStandSettings.boxes.RemoveAt(i);
}
}
}
}