import { xchacha20poly1305 } from '@noble/ciphers/chacha';
import { bytesToHex, hexToBytes, utf8ToBytes } from '@noble/ciphers/utils';
import { managedNonce } from '@noble/ciphers/webcrypto';
import { sha256 } from '@noble/hashes/sha2';

export type SymmetricEncryptOptions = {
  key: string;
  data: string;
};

export const symmetricEncrypt = ({ key, data }: SymmetricEncryptOptions) => {
  const keyAsBytes = sha256(key);
  const dataAsBytes = utf8ToBytes(data);

  const chacha = managedNonce(xchacha20poly1305)(keyAsBytes); // manages nonces for you

  return bytesToHex(chacha.encrypt(dataAsBytes));
};

export type SymmetricDecryptOptions = {
  key: string;
  data: string;
};

export const symmetricDecrypt = ({ key, data }: SymmetricDecryptOptions) => {
  const keyAsBytes = sha256(key);
  const dataAsBytes = hexToBytes(data);

  const chacha = managedNonce(xchacha20poly1305)(keyAsBytes); // manages nonces for you

  return chacha.decrypt(dataAsBytes);
};

export { sha256 };
