/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
#pragma once

#include "cmConfigure.h" // IWYU pragma: keep

#include <cstddef>
#include <iostream>
#include <memory>
#include <string>
#include <vector>

#include <cm/string_view>

/**
 * @brief Abstract base class for cryptographic hash generators
 */
class cmCryptoHash
{
public:
  enum Algo
  {
    AlgoMD5,
    AlgoSHA1,
    AlgoSHA224,
    AlgoSHA256,
    AlgoSHA384,
    AlgoSHA512,
    AlgoSHA3_224,
    AlgoSHA3_256,
    AlgoSHA3_384,
    AlgoSHA3_512
  };

  cmCryptoHash(Algo algo);
  ~cmCryptoHash();

  cmCryptoHash(cmCryptoHash const&) = delete;
  cmCryptoHash& operator=(cmCryptoHash const&) = delete;

  /// @brief Returns a new hash generator of the requested type
  /// @arg algo Hash type name. Supported hash types are
  ///      MD5, SHA1, SHA224, SHA256, SHA384, SHA512,
  ///      SHA3_224, SHA3_256, SHA3_384, SHA3_512
  /// @return A valid auto pointer if algo is supported or
  ///         an invalid/NULL pointer otherwise
  static std::unique_ptr<cmCryptoHash> New(cm::string_view algo);

  /// @brief Converts a hex character to its binary value (4 bits)
  /// @arg input Hex character [0-9a-fA-F].
  /// @arg output Binary value of the input character (4 bits)
  /// @return True if input was a valid hex character
  static bool IntFromHexDigit(char input, char& output);

  /// @brief Converts a byte hash to a sequence of hex character pairs
  static std::string ByteHashToString(std::vector<unsigned char> const& hash);

  /// @brief Calculates a binary hash from string input data
  /// @return Binary hash vector
  std::vector<unsigned char> ByteHashString(cm::string_view input);

  /// @brief Calculates a binary hash from stream content
  /// @see ByteHashString()
  /// @return Non empty binary hash vector if the stream was read successfully.
  ///         An empty vector otherwise.
  std::vector<unsigned char> ByteHashStream(std::istream& sin);

  /// @brief Calculates a binary hash from file content
  /// @see ByteHashString()
  /// @return Non empty binary hash vector if the file was read successfully.
  ///         An empty vector otherwise.
  std::vector<unsigned char> ByteHashFile(std::string const& file);

  /// @brief Calculates a hash string from string input data
  /// @return Sequence of hex characters pairs for each byte of the binary hash
  std::string HashString(cm::string_view input);

  /// @brief Calculates a hash string from stream content
  /// @see HashString()
  /// @return Non empty hash string if the stream was read successfully.
  ///         An empty string otherwise.
  std::string HashStream(std::istream& sin);

  /// @brief Calculates a hash string from file content
  /// @see HashString()
  /// @return Non empty hash string if the file was read successfully.
  ///         An empty string otherwise.
  std::string HashFile(std::string const& file);

  /// @brief Returns the name of the hash type.
  /// @return The name of the hash type associated with this hash generator.
  std::string GetHashAlgoName() const;

  void Initialize();
  void Append(void const*, size_t);
  void Append(cm::string_view input);
  std::vector<unsigned char> Finalize();
  std::string FinalizeHex();

private:
  unsigned int Id;
  struct rhash_context* CTX;
};
