use crate::metrics::RoundStatus as MetricsRoundStatus;

use super::RoundToolExecutionResult;

#[derive(Debug)]
pub(super) struct RoundExecutionState {
    pub awaiting_clarification: bool,
    pub round_status: MetricsRoundStatus,
    pub round_error: Option<String>,
}

impl Default for RoundExecutionState {
    fn default() -> Self {
        Self {
            awaiting_clarification: false,
            round_status: MetricsRoundStatus::Success,
            round_error: None,
        }
    }
}

impl RoundExecutionState {
    pub(super) fn mark_awaiting_clarification(&mut self) {
        self.awaiting_clarification = true;
    }

    pub(super) fn mark_unsuccessful_tool(&mut self, tool_name: &str) {
        if self.round_error.is_none() {
            self.round_status = MetricsRoundStatus::Error;
            self.round_error = Some(format!(
                "Tool \"{}\" returned an unsuccessful result",
                tool_name
            ));
        }
    }

    pub(super) fn mark_tool_execution_error(&mut self, error_message: String) {
        self.round_status = MetricsRoundStatus::Error;
        self.round_error = Some(error_message);
    }

    pub(super) fn into_result(self) -> RoundToolExecutionResult {
        RoundToolExecutionResult {
            awaiting_clarification: self.awaiting_clarification,
            round_status: self.round_status,
            round_error: self.round_error,
        }
    }
}
