// 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_VALIDATOR_MANIFEST_STORE_VALIDATOR_IMPL_H_
#define THIRD_PARTY_CREDENTIO_VALIDATOR_MANIFEST_STORE_VALIDATOR_IMPL_H_

#include <memory>

#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "assertion/validator.h"
#include "claim/validator.h"
#include "cose/verifier.h"
#include "crypto/hash.h"
#include "proto/ingredient_validation_result.pb.h"
#include "proto/validation_result.pb.h"
#include "validator/manifest_store_validator.h"
#include "validator/validator_options.h"

namespace credentio {

class ManifestStoreValidatorImpl : public ManifestStoreValidator {
 public:
  explicit ManifestStoreValidatorImpl(ValidatorOptions options);

  absl::StatusOr<std::unique_ptr<PartialValidationResultProto>> Validate(
      absl::string_view manifest_store) const override;

 private:
  std::unique_ptr<CoseVerifier> cose_verifier_;
  const ValidatorOptions options_;
  ClaimValidatorImpl claim_validator_;
  AssertionValidator assertion_validator_;
  const HashCheckerFactory& hash_checker_factory_;
};

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_VALIDATOR_MANIFEST_STORE_VALIDATOR_IMPL_H_
