// 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_RESULT_H_
#define THIRD_PARTY_CREDENTIO_VALIDATOR_RESULT_H_

#include <memory>
#include <string>
#include <utility>

#include "absl/base/nullability.h"
#include "absl/strings/string_view.h"
#include "proto/assertion.pb.h"
#include "proto/validation_result.pb.h"

namespace credentio {

// Result of validating a C2PA asset.
//
// For now, this is just a wrapper for `ValidationResultProto`.
class ValidationResult {
 public:
  explicit ValidationResult(std::unique_ptr<ValidationResultProto> proto,
                            std::string manifest_store_bytes = "")
      : proto_(std::move(proto)),
        manifest_store_bytes_(std::move(manifest_store_bytes)) {}

  const ValidationResultProto& proto() const { return *proto_; }
  ValidationResultProto& mutable_proto() { return *proto_; }

  std::unique_ptr<ValidationResultProto> release_proto() {
    return std::move(proto_);
  }

  absl::string_view manifest_store_bytes() const {
    return manifest_store_bytes_;
  }

 private:
  std::unique_ptr<ValidationResultProto> proto_;
  std::string manifest_store_bytes_;
};

// Returns a pointer to the assertion with the given URI, or nullptr if not
// found.
const Assertion* absl_nullable GetAssertion(
    const PartialValidationResultProto* result,
    absl::string_view assertion_uri);

// Returns a pointer to the Manifest containing the assertion with the
// given URI, or nullptr if not found.
Manifest* absl_nullable GetMutableManifestForAssertion(
    PartialValidationResultProto* result, absl::string_view assertion_uri);

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_VALIDATOR_RESULT_H_
