using System.Collections.Generic;
using System.IO;

/*
    All of this is pretty much stolen from COM3D2.CacheEditMenu. Thanks Mr. Horsington.
    https://git.coder.horse/ghorsington/COM3D2.CacheEditMenu
*/
namespace MeidoPhotoStudio.Plugin;

public class MenuFileCache
{
    private const int cacheVersion = 765;

    public static readonly string cachePath = Path.Combine(Constants.configPath, "cache.dat");

    private readonly Dictionary<string, ModItem> modItems;

    private bool rebuild;

    public ModItem this[string menu]
    {
        get => modItems[menu];
        set
        {
            if (!modItems.ContainsKey(menu))
            {
                rebuild = true;
                modItems[menu] = value;
            }
        }
    }

    public MenuFileCache()
    {
        modItems = new();

        if (File.Exists(cachePath))
            Deserialize();
    }

    public bool Has(string menuFileName) =>
        modItems.ContainsKey(menuFileName);

    public void Serialize()
    {
        if (!rebuild)
            return;

        using var binaryWriter = new BinaryWriter(File.OpenWrite(cachePath));

        binaryWriter.Write(cacheVersion);

        foreach (var item in modItems.Values)
            item.Serialize(binaryWriter);
    }

    private void Deserialize()
    {
        using var binaryReader = new BinaryReader(File.OpenRead(cachePath));

        if (binaryReader.ReadInt32() is not cacheVersion)
        {
            Utility.LogInfo("Cache version out of date. Rebuilding");

            return;
        }

        while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length)
        {
            var item = ModItem.Deserialize(binaryReader);

            modItems[item.MenuFile] = item;
        }
    }
}
