// 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_TRACKER_H_
#define THIRD_PARTY_CREDENTIO_VALIDATOR_TRACKER_H_

#include <stdbool.h>

#include <string>

#include "absl/container/flat_hash_set.h"
#include "absl/strings/string_view.h"
#include "constants/status_codes.h"
#include "google/protobuf/repeated_ptr_field.h"
#include "proto/manifest.pb.h"
#include "proto/validation_status.pb.h"

namespace credentio {

// Tracks the validation process by accumulating the C2PA status codes returned
// in various validation steps.
class ValidationTracker {
 public:
  // Constructs a new validation tracker for the given manifest.
  // Status values will be recorded in the given manifest, and the URL of the
  // manifest itself will be used by default.
  explicit ValidationTracker(Manifest* manifest);

  // Constructs a new validation tracker for the given manifest label and
  // status set.
  explicit ValidationTracker(absl::string_view manifest_label,
                             ValidationStatusSet* status_set);

  // Returns a tracker that uses the URL of the given assertion by default.
  // Status values are recorded to the same location as the parent tracker.
  ValidationTracker AssertionTracker(absl::string_view assertion_label);

  struct RecordOptions {
    // The url to record with the status. If the url is empty, the manifest url
    // is used. If the url starts with "self#jumbf=", the supplied url is used.
    // Otherwise the supplied value is interpreted as a path relative to the
    // manifest url.
    absl::string_view url = "";
    // An optional explanation for the status.
    absl::string_view explanation = "";
  };

  // Records a C2PA success status code.
  void RecordSuccess(SuccessStatusCode status, RecordOptions options);

  // Records a C2PA informational status code.
  void RecordInformational(InformationalStatusCode status,
                           RecordOptions options);

  // Records a C2PA failure status code.
  void RecordFailure(FailureStatusCode status, RecordOptions options);

  // Returns if the validation process has any failures so far.
  bool HasFailures() const;
  // Returns the C2PA failure status codes observed so far.
  absl::flat_hash_set<std::string> GetFailures() const;
  // Returns the C2PA failure statuses observed so far.
  google::protobuf::RepeatedPtrField<ValidationStatus> GetFailureStatuses()
      const {
    return status_set_->failures();
  }
  // Returns the C2PA success status codes observed so far.
  absl::flat_hash_set<std::string> GetSuccesses() const;
  // Returns the C2PA success statuses observed so far.
  google::protobuf::RepeatedPtrField<ValidationStatus> GetSuccessStatuses()
      const {
    return status_set_->successes();
  }
  // Returns the C2PA informational status codes observed so far.
  absl::flat_hash_set<std::string> GetInformationals() const;
  // Returns the C2PA informational statuses observed so far.
  google::protobuf::RepeatedPtrField<ValidationStatus>
  GetInformationalStatuses() const {
    return status_set_->informationals();
  }

  // Merges the statuses from a ValidationStatusSet into this tracker.
  void MergeStatuses(const ValidationStatusSet& statuses);

 private:
  absl::string_view manifest_label_;
  absl::string_view assertion_label_;
  ValidationStatusSet* const status_set_;
  std::string id_;
};

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_VALIDATOR_TRACKER_H_
