use std::time::Duration;

use super::ContextualUserFragment;

#[derive(Debug, Clone, PartialEq)]
pub(crate) struct UserShellCommand {
    pub(crate) command: String,
    pub(crate) exit_code: i32,
    pub(crate) duration_seconds: f64,
    pub(crate) output: String,
}

impl UserShellCommand {
    pub(crate) fn new(
        command: impl Into<String>,
        exit_code: i32,
        duration: Duration,
        output: impl Into<String>,
    ) -> Self {
        Self {
            command: command.into(),
            exit_code,
            duration_seconds: duration.as_secs_f64(),
            output: output.into(),
        }
    }
}

impl ContextualUserFragment for UserShellCommand {
    fn role(&self) -> &'static str {
        "user"
    }

    fn markers(&self) -> (&'static str, &'static str) {
        Self::type_markers()
    }

    fn type_markers() -> (&'static str, &'static str) {
        ("<user_shell_command>", "</user_shell_command>")
    }

    fn body(&self) -> String {
        format!(
            "\n<command>\n{}\n</command>\n<result>\nExit code: {}\nDuration: {:.4} seconds\nOutput:\n{}\n</result>\n",
            self.command, self.exit_code, self.duration_seconds, self.output,
        )
    }
}
