declare module 'libsodium-wrappers' {
  interface SodiumPlus {
    ready: Promise<void>

    // Random bytes
    randombytes_buf(length: number): Uint8Array

    // Secret-box (XSalsa20-Poly1305) — "_easy" variants
    crypto_secretbox_easy(
      message: Uint8Array,
      nonce: Uint8Array,
      key: Uint8Array
    ): Uint8Array
    /** Throws on failure (wrong key / corrupted ciphertext) */
    crypto_secretbox_open_easy(
      ciphertext: Uint8Array,
      nonce: Uint8Array,
      key: Uint8Array
    ): Uint8Array
    crypto_secretbox_keygen(): Uint8Array

    // Box (X25519 + XSalsa20-Poly1305)
    crypto_box_easy(
      message: Uint8Array,
      nonce: Uint8Array,
      publicKey: Uint8Array,
      secretKey: Uint8Array
    ): Uint8Array
    crypto_box_open_easy(
      ciphertext: Uint8Array,
      nonce: Uint8Array,
      publicKey: Uint8Array,
      secretKey: Uint8Array
    ): Uint8Array
    crypto_box_keypair(): { publicKey: Uint8Array; privateKey: Uint8Array; keyType: string }

    // Password hashing
    crypto_pwhash(
      outlen: number,
      passwd: string,
      salt: Uint8Array,
      opslimit: number,
      memlimit: number,
      alg: number
    ): Uint8Array

    // Encoding helpers
    to_base64(data: Uint8Array, variant?: number): string
    from_base64(data: string, variant?: number): Uint8Array
    to_string(data: Uint8Array): string
    from_string(data: string): Uint8Array
    to_hex(data: Uint8Array): string
    from_hex(data: string): Uint8Array

    // Base64 variant constants
    base64_variants: {
      ORIGINAL: number
      ORIGINAL_NO_PADDING: number
      URLSAFE: number
      URLSAFE_NO_PADDING: number
    }

    // Constants
    crypto_pwhash_SALTBYTES: number
    crypto_pwhash_OPSLIMIT_SENSITIVE: number
    crypto_pwhash_MEMLIMIT_SENSITIVE: number
    crypto_pwhash_OPSLIMIT_MODERATE: number
    crypto_pwhash_MEMLIMIT_MODERATE: number
    crypto_pwhash_ALG_DEFAULT: number
    crypto_secretbox_NONCEBYTES: number
    crypto_secretbox_KEYBYTES: number
    crypto_secretbox_MACBYTES: number
    crypto_box_NONCEBYTES: number
    crypto_box_PUBLICKEYBYTES: number
    crypto_box_SECRETKEYBYTES: number
  }

  const sodium: SodiumPlus
  export default sodium
}
