// 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_CBOR_ENCODER_H_
#define THIRD_PARTY_CREDENTIO_ASSERTION_ASSERTION_CBOR_ENCODER_H_

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

namespace credentio {

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

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

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

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

 private:
  cbor::FromProtoOptions options_;
};

// Returns a singleton StandardAssertionCborEncoder.
const AssertionCborEncoder& GetAssertionCborEncoder();

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_ASSERTION_ASSERTION_CBOR_ENCODER_H_
