/* eslint require-jsdoc: off */

'use strict';

/** Node.js Crypt(3) Library

  Inspired by (and intended to be compatible with) sendanor/crypt3

  see https://github.com/sendanor/node-crypt3

  The key difference is the removal of the dependency on the unix crypt(3) function
  which is not platform independent, and requires compilation. Instead, a pure
  javascript version is used.

*/

const crypt = require('unix-crypt-td-js');
const crypto = require('crypto');

function createSalt(type) {
  type = type || 'sha512';

  switch (type) {

    case 'md5':
      return '$1$' + crypto.randomBytes(10).toString('base64');

    case 'blowfish':
      return '$2a$' + crypto.randomBytes(10).toString('base64');

    case 'sha256':
      return '$5$' + crypto.randomBytes(10).toString('base64');

    case 'sha512':
      return '$6$' + crypto.randomBytes(10).toString('base64');

    default:
      throw new TypeError('Unknown salt type at crypt3.createSalt: ' + type);
  }
}

function crypt3(key, salt) {
  salt = salt || createSalt();
  return crypt(key, salt);
}

/** Crypt(3) password and data encryption.
 * @param {string} key user's typed password
 * @param {string} salt Optional salt, for example SHA-512 use "$6$salt$".
 * @returns {string} A generated hash in format $id$salt$encrypted
 * @see https://en.wikipedia.org/wiki/Crypt_(C)
 */
module.exports = crypt3;

/** Create salt
 * @param {string} type The type of salt: md5, blowfish (only some linux distros), sha256 or sha512. Default is sha512.
 * @returns {string} Generated salt string
 */
module.exports.createSalt = createSalt;
