use agent_contracts::{TraceRecorder, TraceRecorderBuilder};
use agent_types::common::BuildError;
use async_trait::async_trait;
use serde_json::Value;

use super::config::TraceRecorderConfig;
use super::trace_recorder::TraceRecorderImpl;

#[derive(Debug, Clone)]
pub struct TraceRecorderBuilderImpl {
    config: TraceRecorderConfig,
}

#[async_trait]
impl TraceRecorderBuilder for TraceRecorderBuilderImpl {
    fn default() -> Self {
        Self {
            config: TraceRecorderConfig::default(),
        }
    }

    fn from_json(mut self, config: Value) -> Result<Self, BuildError> {
        self.config = TraceRecorderConfig::from_json(config)?;
        Ok(self)
    }

    async fn build(&self) -> Result<Box<dyn TraceRecorder>, BuildError> {
        Ok(Box::new(TraceRecorderImpl::new(&self.config).await?))
    }
}