// 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)) {}

  explicit 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_
