// 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.
//

#include "claim/claim_cbor_encoder.h"

#include <string>

#include "absl/base/no_destructor.h"
#include "absl/status/status.h"
#include "absl/status/status_macros.h"
#include "absl/status/statusor.h"
#include "cbor/options.h"
#include "proto/manifest.cbor.h"
#include "proto/manifest.pb.h"

namespace credentio {
namespace {

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

  absl::StatusOr<std::string> ToCbor(const Claim& claim) const override {
    ABSL_ASSIGN_OR_RETURN(auto cbor, cbor::FromProto(claim, options_));
    return cbor->toString();
  }

 private:
  cbor::FromProtoOptions options_;
};

}  // namespace

const ClaimCborEncoder& GetClaimCborEncoder(
    bool skip_validity_checks_for_test) {
  if (skip_validity_checks_for_test) {
    static const absl::NoDestructor<StandardClaimCborEncoder> encoder_for_test(
        /*skip_validity_checks_for_test=*/true);
    return *encoder_for_test;
  } else {
    static const absl::NoDestructor<StandardClaimCborEncoder> encoder(
        /*skip_validity_checks_for_test=*/false);
    return *encoder;
  }
}

}  // namespace credentio
