// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#ifndef THIRD_PARTY_CREDENTIO_CRYPTO_DEFAULT_HASHER_H_
#define THIRD_PARTY_CREDENTIO_CRYPTO_DEFAULT_HASHER_H_

#include <memory>

#include "absl/base/nullability.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "crypto/algorithms.h"
#include "crypto/hash.h"

namespace credentio {

// Returns a `Hasher` for `algorithm` or error if the algorithm is not
// supported. The returned hasher uses the default OpenSSL implementation.
absl::StatusOr<std::unique_ptr<Hasher> absl_nonnull> CreateHasher(
    HashAlgorithm algorithm);

// Returns a `Hasher`, or error if the algorithm is not supported.
absl::StatusOr<std::unique_ptr<Hasher> absl_nonnull> CreateHasher(
    absl::string_view algorithm);

// Returns the default `HashCheckerFactory`.
const HashCheckerFactory& DefaultHashCheckerFactory();

// Returns the default `HasherFactory`.
const HasherFactory& DefaultHasherFactory();

class Sha256HasherFactory : public HasherFactory {
 public:
  absl::StatusOr<std::unique_ptr<Hasher>> Create() const override;
  HashAlgorithm algorithm() const override { return HashAlgorithm::kSha256; }
};

class Sha384HasherFactory : public HasherFactory {
 public:
  absl::StatusOr<std::unique_ptr<Hasher>> Create() const override;
  HashAlgorithm algorithm() const override { return HashAlgorithm::kSha384; }
};

class Sha512HasherFactory : public HasherFactory {
 public:
  absl::StatusOr<std::unique_ptr<Hasher>> Create() const override;
  HashAlgorithm algorithm() const override { return HashAlgorithm::kSha512; }
};

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_CRYPTO_DEFAULT_HASHER_H_
