// 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_ASSERTION_ENCODER_H_
#define THIRD_PARTY_CREDENTIO_ASSERTION_ASSERTION_ENCODER_H_

#include "absl/status/statusor.h"
#include "absl/strings/cord.h"
#include "cbor/options.h"
#include "jumbf/box_builder.h"
#include "proto/assertion.pb.h"

namespace credentio {

// An encoder to serialize an Assertion's metadata to the CBOR or JUMBF format.
class AssertionEncoder {
 public:
  virtual ~AssertionEncoder() = default;

  virtual absl::StatusOr<absl::Cord> ToCbor(
      const Assertion& assertion) const = 0;

  virtual absl::StatusOr<jumbf::BuiltSuperBox> ToJumbf(
      const Assertion& assertion) const;
};

class StandardAssertionEncoder : public AssertionEncoder {
 public:
  explicit StandardAssertionEncoder(bool skip_validity_checks_for_test = false)
      : options_({.skip_validation = skip_validity_checks_for_test}) {}
  ~StandardAssertionEncoder() override = default;

  absl::StatusOr<absl::Cord> ToCbor(const Assertion& assertion) const override;

 private:
  cbor::FromProtoOptions options_;
};

// Returns a singleton StandardAssertionEncoder.
const AssertionEncoder& GetAssertionEncoder(bool skip_validity_checks_for_test);

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_ASSERTION_ASSERTION_ENCODER_H_
