mod ssh;
pub use ssh::*;

use async_trait::async_trait;

use crate::Error;

#[async_trait]
pub trait OPNsenseShell: std::fmt::Debug + Send + Sync {
    async fn exec(&self, command: &str) -> Result<String, Error>;
    async fn write_content_to_temp_file(&self, content: &str) -> Result<String, Error>;
    async fn upload_folder(&self, source: &str, destination: &str) -> Result<String, Error>;
}

#[cfg(test)]
#[derive(Debug)]
pub struct DummyOPNSenseShell;

#[cfg(test)]
#[async_trait]
impl OPNsenseShell for DummyOPNSenseShell {
    async fn exec(&self, _command: &str) -> Result<String, Error> {
        unimplemented!("This is a dummy implementation");
    }
    async fn write_content_to_temp_file(&self, _content: &str) -> Result<String, Error> {
        unimplemented!("This is a dummy implementation");
    }
    async fn upload_folder(&self, _source: &str, _destination: &str) -> Result<String, Error> {
        unimplemented!("This is a dummy implementation");
    }
}
