///|
/// Filesystem/channel helpers for `@pdfwrite`.
///
/// `@pdfwrite` itself is intentionally in-memory: it writes to `@pdfio.Output`.
/// This package concentrates native-only `@fs.File` and filename helpers.

///|
pub struct PdfWriteFs {
  writer : @pdfwrite.PdfWrite
}

///|
pub fn PdfWriteFs::new(logger? : (String) -> Unit) -> PdfWriteFs {
  { writer: @pdfwrite.PdfWrite::new(logger?) }
}

///|
pub fn PdfWriteFs::of_writer(writer : @pdfwrite.PdfWrite) -> PdfWriteFs {
  { writer, }
}

///|
pub async fn PdfWriteFs::pdf_to_channel(
  self : PdfWriteFs,
  preserve_objstm? : Bool = false,
  generate_objstm? : Bool = false,
  compress_objstm? : Bool = false,
  recrypt? : String,
  encryption : @pdfwrite.Encryption?,
  build_new_id : Bool,
  pdf : @pdf.Pdf,
  channel : @fs.File,
) -> Unit {
  let output = @pdfiofs.output_of_channel(channel)
  match recrypt {
    Some(value) =>
      self.writer.pdf_to_output(
        preserve_objstm~,
        generate_objstm~,
        compress_objstm~,
        recrypt=value,
        encryption,
        build_new_id,
        pdf,
        output,
      )
    None =>
      self.writer.pdf_to_output(
        preserve_objstm~,
        generate_objstm~,
        compress_objstm~,
        encryption,
        build_new_id,
        pdf,
        output,
      )
  }
  (output.flush)()
}

///|
pub async fn PdfWriteFs::pdf_to_file_options(
  self : PdfWriteFs,
  preserve_objstm? : Bool = false,
  generate_objstm? : Bool = false,
  compress_objstm? : Bool = false,
  recrypt? : String,
  encryption : @pdfwrite.Encryption?,
  build_new_id : Bool,
  pdf : @pdf.Pdf,
  filename : String,
) -> Unit {
  let file = @fs.open(filename, mode=WriteOnly, create=0o644, truncate=true)
  defer file.close()
  match recrypt {
    Some(value) =>
      self.pdf_to_channel(
        preserve_objstm~,
        generate_objstm~,
        compress_objstm~,
        recrypt=value,
        encryption,
        build_new_id,
        pdf,
        file,
      )
    None =>
      self.pdf_to_channel(
        preserve_objstm~,
        generate_objstm~,
        compress_objstm~,
        encryption,
        build_new_id,
        pdf,
        file,
      )
  }
}

///|
pub async fn PdfWriteFs::pdf_to_file(
  self : PdfWriteFs,
  pdf : @pdf.Pdf,
  filename : String,
) -> Unit {
  self.pdf_to_file_options(
    preserve_objstm=true,
    generate_objstm=false,
    compress_objstm=true,
    None,
    true,
    pdf,
    filename,
  )
}