use anyhow::Result;
use crate::DynoClient;
use super::utils;

#[derive(Debug)]
pub struct NpuMonitorConfig {
    pub npu_monitor_start: bool,
    pub npu_monitor_stop: bool,
    pub report_interval_s: u32,
    pub mspti_activity_kind: String,
    pub log_file: String
}

impl NpuMonitorConfig {
    fn config(&self) -> String {
        format!(
            r#"NPU_MONITOR_START={}
NPU_MONITOR_STOP={}
REPORT_INTERVAL_S={}
MSPTI_ACTIVITY_KIND={}
NPU_MONITOR_LOG_FILE={}"#,
            self.npu_monitor_start,
            self.npu_monitor_stop,
            self.report_interval_s,
            self.mspti_activity_kind,
            self.log_file
        )
    }
}

pub fn run_npumonitor(mut client: DynoClient, config: NpuMonitorConfig) -> Result<()> {
    let config_str = config.config();
    println!("Npu monitor config = \n{}", config_str);
    let config_str = config_str.replace('\n', "\\n");

    let request_json = format!(
        r#"
{{
    "fn": "setKinetOnDemandRequest",
    "config": "{}",
    "job_id": 0,
    "pids": [0],
    "process_limit": 3
}}"#,
        config_str
    );

    utils::send_msg(&mut client, &request_json)?;
    let resp_str = utils::get_resp(&mut client)?;
    println!("response = {}", resp_str);

    Ok(())
}