use crate::error::Error;
use rand::rngs::OsRng;
use ssh_key::{Algorithm, LineEnding, private::PrivateKey};
use std::path::Path;

#[derive(Default)]
pub struct SshKeyGenerator;

impl SshKeyGenerator {
    pub fn new() -> Self {
        Self
    }

    pub fn generate_key(&self, private_key_path: &Path) -> Result<(), Error> {
        PrivateKey::random(&mut OsRng, Algorithm::Ed25519)
            .map_err(Error::Ssh)?
            .write_openssh_file(private_key_path, LineEnding::LF)
            .map(|_| ())
            .map_err(Error::Ssh)
    }

    pub fn generate_public_key(&self, private_key_path: &Path) -> Result<String, Error> {
        PrivateKey::read_openssh_file(private_key_path)
            .map_err(Error::Ssh)?
            .public_key()
            .to_openssh()
            .map_err(Error::Ssh)
    }
}
