use diesel::SqliteConnection;
use miden_crypto::dsa::ecdsa_k256_keccak::Signature;
use miden_protocol::block::{BlockAccountUpdate, BlockHeader};
use miden_protocol::note::Nullifier;
use miden_protocol::transaction::OrderedTransactionHeaders;
use super::DatabaseError;
use crate::db::NoteRecord;
mod transactions;
pub use transactions::*;
mod block_headers;
pub use block_headers::*;
mod accounts;
pub use accounts::*;
mod nullifiers;
pub use nullifiers::NullifiersPage;
pub(crate) use nullifiers::*;
mod notes;
pub(crate) use notes::*;
pub(crate) fn apply_block(
conn: &mut SqliteConnection,
block_header: &BlockHeader,
signature: &Signature,
notes: &[(NoteRecord, Option<Nullifier>)],
nullifiers: &[Nullifier],
accounts: &[BlockAccountUpdate],
transactions: &OrderedTransactionHeaders,
) -> Result<usize, DatabaseError> {
let mut count = 0;
count += insert_block_header(conn, block_header, signature)?;
count += upsert_accounts(conn, accounts, block_header.block_num())?;
count += insert_scripts(conn, notes.iter().map(|(note, _)| note))?;
count += insert_notes(conn, notes)?;
count += insert_transactions(conn, block_header.block_num(), transactions)?;
count += insert_nullifiers_for_block(conn, nullifiers, block_header.block_num())?;
Ok(count)
}