// 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:
  ValidationResult(std::unique_ptr<ValidationResultProto> proto,
                   std::string manifest_store_bytes)
      : proto_(std::move(proto)),
        manifest_store_bytes_(std::move(manifest_store_bytes)) {}

  ValidationResult(ValidationResultProto&& proto,
                   std::string manifest_store_bytes)
      : proto_(std::make_unique<ValidationResultProto>(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_);
  }

  // Returns the raw manifest store bytes extracted from the asset. May be empty
  // if the `ValidationResult` was constructed without them or after
  // `release_manifest_store_bytes()` is called.
  absl::string_view manifest_store_bytes() const {
    return manifest_store_bytes_;
  }

  // Releases ownership of the raw manifest store bytes. May be empty if the
  // `ValidationResult` was constructed without them or if called more than
  // once.
  std::string release_manifest_store_bytes() {
    return std::move(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_
