using System.Text.Json.Serialization; using DeepDrftContent.FileDatabase.Utils; namespace DeepDrftContent.FileDatabase.Models; /// /// Base class for index data used in serialization /// public abstract class IndexData { public string IndexKey { get; } protected IndexData(string indexKey) { IndexKey = indexKey; } } /// /// Serializable data for directory indexes /// public class DirectoryIndexData : IndexData { public List Entries { get; set; } = new(); public DirectoryIndexData(string indexKey) : base(indexKey) { } public static DirectoryIndexData FromIndex(DirectoryIndex index) { var data = new DirectoryIndexData(index.GetKey()) { Entries = index.GetEntries().ToList() }; return data; } } /// /// Entry data for vault index serialization /// public class VaultEntryData { public string Key { get; set; } = null!; public MetaData Value { get; set; } = null!; } /// /// Serializable data for vault indexes /// public class VaultIndexData : IndexData { public List Entries { get; set; } = new(); public MediaVaultType VaultType { get; set; } public VaultIndexData(string indexKey) : base(indexKey) { VaultType = MediaVaultType.Media; // Default vault type for legacy compatibility } [JsonConstructor] public VaultIndexData(string indexKey, MediaVaultType vaultType) : base(indexKey) { VaultType = vaultType; } public static VaultIndexData FromIndex(VaultIndex index) { var data = new VaultIndexData(index.GetKey(), index.VaultType) { Entries = index.Entries.Select(kvp => new VaultEntryData { Key = kvp.Key, Value = kvp.Value }).ToList() }; return data; } } /// /// Directory index implementation using StructuralSet for entries /// public class DirectoryIndex : IndexData, IDirectoryIndex { public StructuralSet Entries { get; } public DirectoryIndex(DirectoryIndexData indexData) : base(indexData.IndexKey) { Entries = new StructuralSet(); // Load entries from data foreach (var entry in indexData.Entries) { Entries.Add(entry); } } public string GetKey() => IndexKey; public IReadOnlyList GetEntries() => Entries.ToList().AsReadOnly(); public int GetEntriesSize() => Entries.Size; public bool HasEntry(string entryId) => Entries.Has(entryId); public void PutEntry(string entryId) => Entries.Add(entryId); } /// /// Vault index implementation using StructuralMap for entries with metadata /// public class VaultIndex : IndexData, IVaultIndex { public StructuralMap Entries { get; } public MediaVaultType VaultType { get; } public VaultIndex(VaultIndexData indexData) : base(indexData.IndexKey) { Entries = new StructuralMap(); VaultType = indexData.VaultType; // Load entries from data foreach (var entry in indexData.Entries) { Entries.Set(entry.Key, entry.Value); } } public string GetKey() => IndexKey; public IReadOnlyList GetEntries() => Entries.Keys.ToList().AsReadOnly(); public int GetEntriesSize() => Entries.Size; public bool HasEntry(string entryId) => Entries.Has(entryId); public MetaData? GetEntry(string entryId) => Entries.Get(entryId); public void PutEntry(string entryId, MetaData metaData) => Entries.Set(entryId, metaData); public bool RemoveEntry(string entryId) => Entries.Delete(entryId); }