use tracing::{
    debug, error, info, instrument, level_filters::LevelFilter, span, trace, warn, Level,
};
use tracing_subscriber::{layer::SubscriberExt, registry::Registry, Layer};
use tracing_tree::HierarchicalLayer;

fn main() {
    let layer = HierarchicalLayer::default()
        .with_writer(std::io::stdout)
        .with_indent_lines(true)
        .with_indent_amount(2)
        .with_thread_names(true)
        .with_thread_ids(true)
        .with_verbose_exit(true)
        .with_verbose_entry(true)
        .with_deferred_spans(true)
        .with_targets(true)
        .with_span_modes(true)
        .with_filter(LevelFilter::DEBUG);

    let subscriber = Registry::default().with(layer);
    tracing::subscriber::set_global_default(subscriber).unwrap();
    #[cfg(feature = "tracing-log")]
    tracing_log::LogTracer::init().unwrap();

    let app_span = span!(Level::DEBUG, "hierarchical-example", version = %0.1);
    let _e = app_span.enter();

    let server_span = span!(Level::DEBUG, "server", host = "localhost", port = 8080);

    println!("-> This prints before the span open message");

    let _e2 = server_span.enter();
    info!("starting");
    std::thread::sleep(std::time::Duration::from_millis(1000));

    span!(Level::INFO, "empty-span").in_scope(|| {
        // empty span
    });

    info!("listening");
    // Defer two levels of spans
    println!("-> Deferring two levels of spans");
    span!(Level::INFO, "connections").in_scope(|| {
        let peer1 = span!(Level::DEBUG, "conn", peer_addr = "82.9.9.9", port = 42381);
        peer1.in_scope(|| {
            debug!(peer = "peer1", "connected");
            std::thread::sleep(std::time::Duration::from_millis(300));
            debug!(length = 2, "message received");
        });

        drop(peer1);
        let peer2 = span!(Level::DEBUG, "conn", peer_addr = "82.9.9.9", port = 61548);

        // This span will not be printed at all since no event in it will pass the filter
        peer2.in_scope(|| {
            trace!(peer = "peer2", "connected");
            std::thread::sleep(std::time::Duration::from_millis(300));
            trace!(length = 2, "message received");
        });
        drop(peer2);
        let peer3 = span!(Level::DEBUG, "conn", peer_addr = "8.8.8.8", port = 18230);
        peer3.in_scope(|| {
            std::thread::sleep(std::time::Duration::from_millis(300));
            debug!(peer = "peer3", "connected");
        });
        drop(peer3);
        let peer4 = span!(
            Level::DEBUG,
            "foomp",
            normal_var = 43,
            "{} <- format string",
            42
        );
        peer4.in_scope(|| {
            error!("hello");
        });
        drop(peer4);
        let peer1 = span!(Level::DEBUG, "conn", peer_addr = "82.9.9.9", port = 42381);
        peer1.in_scope(|| {
            warn!(algo = "xor", "weak encryption requested");
            std::thread::sleep(std::time::Duration::from_millis(300));
            debug!(length = 8, "response sent");
            debug!("disconnected");
        });
        drop(peer1);
        let peer2 = span!(Level::DEBUG, "conn", peer_addr = "8.8.8.8", port = 18230);
        peer2.in_scope(|| {
            debug!(length = 5, "message received");
            std::thread::sleep(std::time::Duration::from_millis(300));
            debug!(length = 8, "response sent");
            debug!("disconnected");
        });
        drop(peer2);
    });

    warn!("internal error");
    log::error!("this is a log message");
    info!("exit");
}

#[instrument]
fn call_a(name: &str) {
    info!(name, "got a name");
    call_b(name)
}

#[instrument]
fn call_b(name: &str) {
    info!(name, "got a name");
}
