use flatbuffers::{FlatBufferBuilder, WIPOffset};
use crate::registry::compile::{hash::package_id, parse::PkgDefinition as PkgTomlDefinition};
use crate::registry::schema::registry::{PackageIndexEntry, PackageIndexEntryArgs};
use xxhash_rust::xxh3::xxh3_64;
pub fn compile_package_index<'a>(
builder: &mut FlatBufferBuilder<'a>,
pkgs: &[&PkgTomlDefinition],
) -> flatbuffers::WIPOffset<
flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<PackageIndexEntry<'a>>>,
> {
let mut entries: Vec<(u64, u32)> = pkgs
.iter()
.enumerate()
.map(|(index, pkg)| {
let mut key =
Vec::with_capacity(pkg.metadata.authority.len() + pkg.metadata.name.len() + 1);
key.extend_from_slice(pkg.metadata.authority.as_bytes());
key.push(b'#');
key.extend_from_slice(pkg.metadata.name.as_bytes());
(xxh3_64(&key), index as u32)
})
.collect();
entries.sort_unstable_by_key(|x| x.0);
let offsets = entries
.into_iter()
.map(|(id, package)| {
PackageIndexEntry::create(builder, &PackageIndexEntryArgs { id, package })
})
.collect::<Vec<_>>();
builder.create_vector(&offsets)
}