module tagion.script.NameCardScripts;

import std.typecons;
import tagion.basic.Types : Buffer, FileExtension;
import tagion.communication.HiRPC;
import tagion.crypto.SecureInterfaceNet : HashNet;
import tagion.dart.DART;
import tagion.dart.DARTFile;
import tagion.dart.Recorder;
import tagion.gossip.AddressBook;
import tagion.hibon.Document;
import tagion.hibon.HiBONJSON;
import tagion.hibon.HiBONRecord;

Nullable!T readStandardRecord(T)(
        const(HashNet) net,
        HiRPC hirpc,
        DART db,
        Buffer hash,
) if (isHiBONRecord!T) {

    const(Document) readDocFromDB(Buffer[] fingerprints, HiRPC hirpc, DART db) {
        const sender = DART.dartRead(fingerprints, hirpc);
        auto receiver = hirpc.receive(sender.toDoc);
        return db(receiver, false).message["result"].get!Document;
    }

    Nullable!T fromArchive(T)(const(Archive) archive) if (isHiBONRecord!T) {
        if (archive is Archive.init) {
            return Nullable!T.init;
        }
        else {
            return Nullable!T(T(archive.filed));
        }
    }

    auto factory = RecordFactory(net);

    return fromArchive!T(
            factory.recorder(readDocFromDB([hash], hirpc, db))[].doFront
    );
}