use nodedb_types::columnar::ColumnarSchema;
use nodedb_types::surrogate::Surrogate;
use nodedb_types::value::Value;
use crate::delete_bitmap::DeleteBitmap;
use crate::error::ColumnarError;
use crate::reader::OwnedSegmentReader;
use super::extract::extract_row_value;
pub fn materialize_segment_live_rows(
blob: &[u8],
kek: Option<&nodedb_wal::crypto::WalEncryptionKey>,
schema: &ColumnarSchema,
deletes: &DeleteBitmap,
row_surrogates: &[Option<Surrogate>],
) -> Result<Vec<(Value, Option<Surrogate>)>, ColumnarError> {
let is_encrypted = blob.len() >= 4 && blob[0..4] == crate::encrypt::SEGC_MAGIC;
let effective_kek = if is_encrypted { kek } else { None };
let owned = OwnedSegmentReader::open_with_kek(blob, effective_kek)?;
let reader = owned.reader();
let total_rows = reader.row_count() as usize;
let col_count = schema.columns.len();
let col_indices: Vec<usize> = (0..col_count).collect();
let decoded_cols = reader.read_columns(&col_indices, &[])?;
let mut out = Vec::with_capacity(total_rows.saturating_sub(deletes.deleted_count() as usize));
for row_idx in 0..total_rows {
if !deletes.is_empty() && deletes.is_deleted(row_idx as u32) {
continue;
}
let mut map = std::collections::HashMap::with_capacity(col_count);
for (col_idx, decoded) in decoded_cols.iter().enumerate() {
let col = &schema.columns[col_idx];
let value = extract_row_value(decoded, row_idx, &col.column_type, &col.name)?;
map.insert(col.name.clone(), value);
}
let surrogate = row_surrogates.get(row_idx).copied().flatten();
out.push((Value::Object(map), surrogate));
}
Ok(out)
}