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); } } } }