use std::sync::{Arc, atomic::AtomicBool};
use axum::Router;
use tokio::net::TcpListener;
use tokio_util::sync::CancellationToken;
use utoipa_redoc::{Redoc, Servable};
use super::api::admin;
use crate::{io_config::SharedPocketScionIoConfig, state::SharedPocketScionState};
pub async fn start(
cancellation_token: CancellationToken,
ready_state: Arc<AtomicBool>,
system_state: SharedPocketScionState,
io_config: SharedPocketScionIoConfig,
listener: TcpListener,
) -> std::io::Result<()> {
let (router, openapi) =
admin::api::build_management_api(ready_state, system_state, io_config).split_for_parts();
let final_router = Router::new()
.nest("/api/v1", router)
.merge(Redoc::with_url("/docs", openapi));
if let Err(e) = axum::serve(listener, final_router.into_make_service())
.with_graceful_shutdown(cancellation_token.cancelled_owned())
.await
{
tracing::error!(error=%e, "Management API server unexpectedly stopped");
}
tracing::info!("Shutting down Management API server");
Ok(())
}