// 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_DATA_HASH_HARD_BINDING_VALIDATOR_H_
#define THIRD_PARTY_CREDENTIO_BINDINGS_DATA_HASH_HARD_BINDING_VALIDATOR_H_

#include <cstdint>
#include <memory>
#include <optional>

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

namespace credentio {

class DataHashHardBindingValidator : 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;

  // Validates the data hash assertion. The start_offset is the offset of the
  // first byte of the data to validate. The end_offset is the offset of the
  // last byte of the data to validate, -1 means the end of the file. The
  // manifest_store_location is the offset and length of the manifest store
  // based on the entire asset. The offsets specified within the assertion's
  // exclusions are offsets based upon the start of the portion of the asset
  // corresponding to the binding. The offset to exclude that is sent to the
  // hasher is the assertion's exclusion offset PLUS the start_offset.
  void Validate(riegeli::Reader& contents,
                std::optional<ByteRange> manifest_store_location,
                const DataHashAssertion& assertion,
                absl::string_view hard_binding_uri, StatusTracker& tracker,
                bool assertion_in_ingredient_manifest,
                uint64_t start_offset = 0, int64_t end_offset = -1) const;
};

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_BINDINGS_DATA_HASH_HARD_BINDING_VALIDATOR_H_
