use std::sync::{Once, OnceLock};
use tracing_log::LogTracer;
use tracing_subscriber::filter::EnvFilter;
use tracing_subscriber::fmt;
use tracing_subscriber::layer::{Layered, SubscriberExt};
use tracing_subscriber::reload;
use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::{Layer, Registry};
pub type BoxLayer = Box<dyn Layer<Registry> + Send + Sync + 'static>;
type LayerSubscriber = Layered<reload::Layer<Vec<BoxLayer>, Registry>, Registry>;
pub(super) static LAYER_RELOAD_HANDLE: OnceLock<reload::Handle<Vec<BoxLayer>, Registry>> =
OnceLock::new();
pub(super) static FILTER_RELOAD_HANDLE: OnceLock<reload::Handle<EnvFilter, LayerSubscriber>> =
OnceLock::new();
static INSTALL: Once = Once::new();
pub fn install_bootstrap_logger() {
INSTALL.call_once(|| {
let initial_layer: BoxLayer = fmt::layer().with_writer(std::io::stderr).boxed();
let (layer_slot, layer_handle) = reload::Layer::new(vec![initial_layer]);
let initial_filter =
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
let (filter_slot, filter_handle) = reload::Layer::new(initial_filter);
let _ = LAYER_RELOAD_HANDLE.set(layer_handle);
let _ = FILTER_RELOAD_HANDLE.set(filter_handle);
let _ = tracing_subscriber::registry()
.with(layer_slot)
.with(filter_slot)
.try_init();
let _ = LogTracer::init();
});
}