//
//  Ndb.swift
//  damus
//
//  Created by William Casarin on 2023-08-25.
//

import Foundation

class Ndb {
    let ndb: ndb_t

    static var db_path: String {
        (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.absoluteString.replacingOccurrences(of: "file://", with: ""))!
    }

    init?() {
        var ndb_p: OpaquePointer? = nil

        let ok = Ndb.db_path.withCString { testdir in
            return ndb_init(&ndb_p, testdir, 1024 * 1024 * 1024 * 32, 4) != 0
        }

        if !ok {
            return nil
        }

        self.ndb = ndb_t(ndb: ndb_p)
    }

    func lookup_note(_ id: NoteId) -> NdbNote? {
        id.id.withUnsafeBytes { bs in
            guard let note_p = ndb_get_note_by_id(ndb.ndb, bs, nil) else {
                return nil
            }
            return NdbNote(note: note_p, owned_size: nil)
        }
    }

    func lookup_profile(_ pubkey: Pubkey) -> NdbProfile? {
        return pubkey.id.withUnsafeBytes { pk_bytes in
            var size: Int = 0
            guard let profile_p = ndb_get_profile_by_pubkey(ndb.ndb, pk_bytes, &size) else {
                return nil
            }

            let buf = ByteBuffer(assumingMemoryBound: profile_p, capacity: size)
            return NdbProfile(buf, o: 0)
        }
    }

    func process_events(_ str: String) -> Bool {
        return str.withCString { cstr in
            return ndb_process_events(ndb.ndb, cstr, str.utf8.count) != 0
        }
    }

    deinit {
        ndb_destroy(ndb.ndb)
    }
}
