mod model;

pub use model::*;
use std::process::{Child, Command, Output, Stdio};

const YOUTUBE_DL_COMMAND: &str = "yt-dlp";

pub struct YtDlp {
  command: Command,
  args: Vec<String>,
}

impl Default for YtDlp {
  fn default() -> Self {
    Self::new()
  }
}

impl YtDlp {
  pub fn new() -> Self {
    let mut cmd = Command::new(YOUTUBE_DL_COMMAND);
    cmd
      .env("LC_ALL", "en_US.UTF-8")
      .stdout(Stdio::piped())
      .stdin(Stdio::piped())
      .stderr(Stdio::piped());
    Self {
      command: cmd,
      args: Vec::new(),
    }
  }

  pub fn arg(&mut self, arg: &str) -> &mut Self {
    self.args.push(arg.to_owned());
    self
  }

  pub fn execute(&mut self) -> std::io::Result<Output> {
    self
      .command
      .args(self.args.clone())
      .spawn()
      .and_then(Child::wait_with_output)
  }
}
