using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace BulletHellTemplate
{
///
/// Handles saving and loading of purchased items data using PlayerPrefs.
/// This class does not apply any logic or validation. Only persists data.
///
public static partial class PlayerSave
{
private static List purchasedCharacters = new();
private static List purchasedIcons = new();
private static List purchasedFrames = new();
private static List purchasedShopItems = new();
private static List purchasedInventoryItems = new();
private const string KeyCharacters = "PurchasedCharacters";
private const string KeyIcons = "PurchasedIcons";
private const string KeyFrames = "PurchasedFrames";
private const string KeyShopItems = "PurchasedShopItems";
private const string KeyInventoryItems = "PurchasedInventoryItems";
///
/// Loads all purchased items from PlayerPrefs into memory.
///
public static void LoadAllPurchased()
{
purchasedCharacters = LoadList(KeyCharacters)?.purchasedCharacters ?? new();
purchasedIcons = LoadList(KeyIcons)?.purchasedIcons ?? new();
purchasedFrames = LoadList(KeyFrames)?.purchasedFrames ?? new();
purchasedShopItems = LoadList(KeyShopItems)?.purchasedShopItems ?? new();
purchasedInventoryItems = LoadList(KeyInventoryItems)?.purchasedInventoryItems ?? new();
}
///
/// Saves all purchased items to PlayerPrefs.
///
public static void SaveAllPurchased()
{
SaveList(KeyCharacters, new PurchasedCharacterList(purchasedCharacters));
SaveList(KeyIcons, new PurchasedIconList(purchasedIcons));
SaveList(KeyFrames, new PurchasedFrameList(purchasedFrames));
SaveList(KeyShopItems, new PurchasedShopItemList(purchasedShopItems));
SaveList(KeyInventoryItems, new PurchasedInventoryItemList(purchasedInventoryItems));
PlayerPrefs.Save();
}
public static void ClearAllPurchased()
{
purchasedCharacters.Clear();
purchasedIcons.Clear();
purchasedFrames.Clear();
purchasedShopItems.Clear();
purchasedInventoryItems.Clear();
}
// Setters – used only by logic handlers like OfflinePurchasesHandler
public static void SetCharacters(List list) => purchasedCharacters = list;
public static void SetIcons(List list) => purchasedIcons = list;
public static void SetFrames(List list) => purchasedFrames = list;
public static void SetShopItems(List list) => purchasedShopItems = list;
public static void SetInventoryItems(List list) => purchasedInventoryItems = list;
// Adders – for appending from external logic (not validated here)
public static void AddCharacter(PurchasedCharacter c) { purchasedCharacters.Add(c); SaveAllPurchased(); }
public static void AddIcon(PurchasedIcon i) { purchasedIcons.Add(i); SaveAllPurchased(); }
public static void AddFrame(PurchasedFrame f) { purchasedFrames.Add(f); SaveAllPurchased(); }
public static void AddShopItem(PurchasedShopItem s) { purchasedShopItems.Add(s); SaveAllPurchased(); }
public static void AddInventoryItem(PurchasedInventoryItem i) { purchasedInventoryItems.Add(i); SaveAllPurchased(); }
// Getters
public static List GetCharacters() => new(purchasedCharacters);
public static List GetIcons() => new(purchasedIcons);
public static List GetFrames() => new(purchasedFrames);
public static List GetShopItems() => new(purchasedShopItems);
public static List GetInventoryItems() => new(purchasedInventoryItems);
// Checkers
public static bool IsCharacterPurchased(string id) => purchasedCharacters.Any(c => c.characterId == id);
public static bool IsIconPurchased(string id) => purchasedIcons.Any(i => i.iconId == id);
public static bool IsFramePurchased(string id) => purchasedFrames.Any(f => f.frameId == id);
public static bool IsShopItemPurchased(string id) => purchasedShopItems.Any(s => s.itemId == id);
public static bool IsInventoryItemPurchased(string id) => purchasedInventoryItems.Any(i => i.itemId == id);
// Internal JSON helpers
private static T LoadList(string key) where T : class
{
var json = PlayerPrefs.GetString(key, null);
return string.IsNullOrEmpty(json) ? null : JsonUtility.FromJson(json);
}
private static void SaveList(string key, T list)
{
string json = JsonUtility.ToJson(list);
PlayerPrefs.SetString(key, json);
}
public static void WipePurchasedCache()
{
PlayerPrefs.DeleteKey("PurchasedCharacters");
PlayerPrefs.DeleteKey("PurchasedIcons");
PlayerPrefs.DeleteKey("PurchasedFrames");
PlayerPrefs.DeleteKey("PurchasedShopItems");
PlayerPrefs.DeleteKey("PurchasedInventoryItems");
ClearAllPurchased();
PlayerPrefs.Save();
}
}
}