use nautilus_common::live::get_runtime;
use nautilus_core::python::{to_pyruntime_err, to_pyvalue_err};
use nautilus_infrastructure::sql::pg::PostgresConnectOptions;
use nautilus_model::defi::{PoolIdentifier, pool_analysis::PoolSnapshot};
use pyo3::prelude::*;
use crate::cache::database::BlockchainCacheDatabase;
#[pyfunction]
#[pyo3_stub_gen::derive::gen_stub_pyfunction(module = "nautilus_trader.adapters.blockchain")]
#[pyo3(name = "load_pool_snapshot")]
#[pyo3(signature = (pg_config, chain_id, pool_address, before_block=None, require_valid=true))]
#[gen_stub(
override_return_type(
type_repr = "typing.Optional[nautilus_trader.model.PoolSnapshot]",
imports = ("typing", "nautilus_trader.model"),
),
)]
pub fn py_load_pool_snapshot(
#[gen_stub(
override_type(
type_repr = "nautilus_trader.infrastructure.PostgresConnectOptions",
imports = ("nautilus_trader.infrastructure",),
),
)]
pg_config: PostgresConnectOptions,
chain_id: u32,
pool_address: &str,
before_block: Option<u64>,
require_valid: bool,
) -> PyResult<Option<PoolSnapshot>> {
let pool_identifier = PoolIdentifier::new_checked(pool_address).map_err(to_pyvalue_err)?;
get_runtime().block_on(async move {
let database = BlockchainCacheDatabase::connect(pg_config.into())
.await
.map_err(to_pyruntime_err)?;
database
.load_latest_pool_snapshot(chain_id, &pool_identifier, before_block, require_valid)
.await
.map_err(to_pyruntime_err)
})
}