// 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_BINDINGS_BOXES_HASH_HARD_BINDING_VALIDATOR_H_
#define THIRD_PARTY_CREDENTIO_BINDINGS_BOXES_HASH_HARD_BINDING_VALIDATOR_H_

#include <memory>
#include <vector>

#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "bindings/hard_binding_validator.h"
#include "formats/asset_byte_info.h"
#include "proto/boxes_hash_assertion.pb.h"
#include "proto/validation_result.pb.h"
#include "riegeli/bytes/reader.h"
#include "utils/status_tracker.h"

namespace credentio {

class BoxesHashHardBindingValidator : public HardBindingValidator {
 public:
  absl::StatusOr<std::unique_ptr<ValidationResultProto>> Validate(
      riegeli::Reader& contents, const AssetByteInfo& asset_byte_info,
      std::unique_ptr<PartialValidationResultProto> partial_validation_result)
      const override;

  void Validate(riegeli::Reader& contents, std::vector<AssetBox> contents_boxes,
                const BoxesHashAssertion& assertion,
                absl::string_view hard_binding_uri,
                StatusTracker& tracker) const;
};

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_BINDINGS_BOXES_HASH_HARD_BINDING_VALIDATOR_H_
