use std::future::Future;

use atomcode_telemetry::{CurrentContext, SessionMode};

use crate::AppState;

/// Wraps an async closure in a telemetry `CurrentContext::scope` that sets
/// `mode` (from client header), `repo_origin` from `AppState`, and an optional
/// per-request `session_id`. Every handler that emits telemetry events should
/// call this at its entry point.
pub async fn daemon_scope<F, Fut, R>(
    state: &AppState,
    session_id: Option<uuid::Uuid>,
    mode: SessionMode,
    f: F,
) -> R
where
    F: FnOnce() -> Fut,
    Fut: Future<Output = R>,
{
    let ctx = CurrentContext {
        mode: Some(mode),
        repo_origin: Some(state.repo_origin.clone()),
        session_id,
        ..CurrentContext::current()
    };
    CurrentContext::scope(ctx, f).await
}