///|
/// Encryption methods.
pub type EncryptionMethod = @pdfcrypt.EncryptionMethod

///|
/// Encryption settings.
pub struct Encryption {
  encryption_method : @pdfcrypt.EncryptionMethod
  owner_password : String
  user_password : String
  permissions : Array[@pdfcrypt.Permission]
}

///|
pub fn Encryption::new(
  encryption_method : @pdfcrypt.EncryptionMethod,
  owner_password : String,
  user_password : String,
  permissions : Array[@pdfcrypt.Permission],
) -> Encryption {
  { encryption_method, owner_password, user_password, permissions }
}

///|
let dummy_encryption : Encryption = {
  encryption_method: @pdfcrypt.EncryptionMethod::AlreadyEncrypted,
  owner_password: "",
  user_password: "",
  permissions: [],
}

///|
fn crypt_if_necessary(
  pdf : @pdf.Pdf,
  encryption : Encryption?,
) -> @pdf.Pdf raise {
  match encryption {
    None => pdf
    Some(enc) =>
      match enc.encryption_method {
        @pdfcrypt.EncryptionMethod::PDF40bit =>
          @pdfcrypt.PdfCrypt::new().encrypt_pdf_40bit(
            enc.user_password,
            enc.owner_password,
            enc.permissions,
            pdf,
          )
        @pdfcrypt.EncryptionMethod::PDF128bit =>
          @pdfcrypt.PdfCrypt::new().encrypt_pdf_128bit(
            enc.user_password,
            enc.owner_password,
            enc.permissions,
            pdf,
          )
        @pdfcrypt.EncryptionMethod::AES128bit(encrypt_metadata) =>
          @pdfcrypt.PdfCrypt::new().encrypt_pdf_AES(
            encrypt_metadata,
            enc.user_password,
            enc.owner_password,
            enc.permissions,
            pdf,
          )
        @pdfcrypt.EncryptionMethod::AES256bit(encrypt_metadata) =>
          @pdfcrypt.PdfCrypt::new().encrypt_pdf_AES256(
            encrypt_metadata,
            enc.user_password,
            enc.owner_password,
            enc.permissions,
            pdf,
          )
        @pdfcrypt.EncryptionMethod::AES256bitISO(encrypt_metadata) =>
          @pdfcrypt.PdfCrypt::new().encrypt_pdf_AES256ISO(
            encrypt_metadata,
            enc.user_password,
            enc.owner_password,
            enc.permissions,
            pdf,
          )
        @pdfcrypt.EncryptionMethod::AlreadyEncrypted => pdf
      }
  }
}