/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2025. All rights reserved.
 */
package magic.vdb

import serialization.serialization.*
import std.collection.HashMap
import std.fs.{File, OpenOption}
import encoding.json.*

/**
 * A simple index -> String map
 * Use a hashmap to store the map and save it as a json file
 */
public class SimpleIndexMap <: IndexMap<SimpleIndexMap, String> &Serializable<SimpleIndexMap> {
    // Since we use DataModel to serialize the map, its key should also be String
    var map = HashMap<String, String>()

    public func set(index: Int64, content: String): Unit {
        map.put(index.toString(), content)
    }

    override public func add(content: String): Unit {
        set(map.size, content)
    }

    override public func get(index: Int64): String {
        return map[index.toString()]
    }

    public func serialize(): DataModel {
        return DataModelStruct().add(field<HashMap<String, String>>("map", map))
    }

    public static func deserialize(dm: DataModel): SimpleIndexMap {
        let dms = match (dm) {
            case data: DataModelStruct => data
            case _ => throw Exception("this data is not DataModelStruct")
        }
        let result = SimpleIndexMap()
        result.map = HashMap<String, String>.deserialize(dms.get("map"))
        return result
    }

    override public func save(filePath: String): Unit {
        try (file = File(filePath, OpenOption.CreateOrTruncate(false))) {
            let bytes: Array<Byte> = this.serialize().toJson().toString().toArray()
            file.write(bytes)
        }
    }

    redef public static func load(filePath:String): SimpleIndexMap {
        let bytes: Array<Byte> = File.readFrom(filePath)
        let jsonStr: String = String.fromUtf8(bytes)
        let jv = JsonValue.fromStr(jsonStr)
        let dm = DataModelStruct.fromJson(jv)
        return SimpleIndexMap.deserialize(dm)
    }
}