// 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_ASSERTION_HASHED_URI_VALIDATOR_H_
#define THIRD_PARTY_CREDENTIO_ASSERTION_HASHED_URI_VALIDATOR_H_

#include <optional>
#include <string>
#include <utility>

#include "absl/strings/string_view.h"
#include "constants/status_codes.h"
#include "crypto/default/hasher.h"
#include "crypto/hash.h"
#include "jumbf/uri.h"
#include "proto/hashed_uri.pb.h"
#include "validator/tracker.h"

namespace credentio {

// A validator that validates `hashed_uri` according to
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_validation_of_references
class HashedUriValidator {
 public:
  struct Codes {
    FailureStatusCode missing = FailureStatusCode::kHashedUriMissing;
    FailureStatusCode mismatch = FailureStatusCode::kHashedUriMismatch;
  };
  HashedUriValidator(std::string manifest_path,
                     const jumbf::UriResolver& uri_resolver,
                     const HashCheckerFactory* hash_checker_factory = nullptr)
      : manifest_path_(std::move(manifest_path)),
        uri_resolver_(uri_resolver),
        hash_checker_factory_(hash_checker_factory == nullptr
                                  ? DefaultHashCheckerFactory()
                                  : *hash_checker_factory) {}
  void SetErrorCodes(Codes codes) { codes_ = codes; }
  void SetDefaultAlgorithm(std::string alg) { alg_ = std::move(alg); }
  // Returns the validated path if validation is successful (i.e., hash is
  // matched); otherwise, std::nullopt.
  std::optional<std::string> Validate(
      const HashedUri& hashed_uri, absl::string_view assertion_url,
      ValidationTracker& validation_tracker) const;

 private:
  std::string manifest_path_;
  const jumbf::UriResolver& uri_resolver_;
  const HashCheckerFactory& hash_checker_factory_;
  Codes codes_;
  std::string alg_;
};
}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_ASSERTION_HASHED_URI_VALIDATOR_H_
