// Copyright 2021 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
//
//     http://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 "tink/jwt/verified_jwt.h"

#include <string>

#include "absl/strings/numbers.h"
#include "absl/strings/str_format.h"
#include "absl/strings/substitute.h"
#include "tink/jwt/internal/json_util.h"

namespace crypto {
namespace tink {

VerifiedJwt::VerifiedJwt() {}

VerifiedJwt::VerifiedJwt(const RawJwt& raw_jwt) {
  raw_jwt_ = raw_jwt;
}

bool VerifiedJwt::HasTypeHeader() const { return raw_jwt_.HasTypeHeader(); }

util::StatusOr<std::string> VerifiedJwt::GetTypeHeader() const {
  return raw_jwt_.GetTypeHeader();
}

bool VerifiedJwt::HasIssuer() const {
  return raw_jwt_.HasIssuer();
}

util::StatusOr<std::string> VerifiedJwt::GetIssuer() const {
  return raw_jwt_.GetIssuer();
}

bool VerifiedJwt::HasSubject() const {
  return raw_jwt_.HasSubject();
}

util::StatusOr<std::string> VerifiedJwt::GetSubject() const {
  return raw_jwt_.GetSubject();
}

bool VerifiedJwt::HasAudiences() const {
  return raw_jwt_.HasAudiences();
}

util::StatusOr<std::vector<std::string>> VerifiedJwt::GetAudiences() const {
  return raw_jwt_.GetAudiences();
}

bool VerifiedJwt::HasJwtId() const {
  return raw_jwt_.HasJwtId();
}

util::StatusOr<std::string> VerifiedJwt::GetJwtId() const {
  return raw_jwt_.GetJwtId();
}

bool VerifiedJwt::HasExpiration() const {
  return raw_jwt_.HasExpiration();
}

util::StatusOr<absl::Time> VerifiedJwt::GetExpiration() const {
  return raw_jwt_.GetExpiration();
}

bool VerifiedJwt::HasNotBefore() const {
  return raw_jwt_.HasNotBefore();
}

util::StatusOr<absl::Time> VerifiedJwt::GetNotBefore() const {
  return raw_jwt_.GetNotBefore();
}

bool VerifiedJwt::HasIssuedAt() const {
  return raw_jwt_.HasIssuedAt();
}

util::StatusOr<absl::Time> VerifiedJwt::GetIssuedAt() const {
  return raw_jwt_.GetIssuedAt();
}

bool VerifiedJwt::IsNullClaim(absl::string_view name) const {
  return raw_jwt_.IsNullClaim(name);
}

bool VerifiedJwt::HasBooleanClaim(absl::string_view name) const {
  return raw_jwt_.HasBooleanClaim(name);
}

util::StatusOr<bool> VerifiedJwt::GetBooleanClaim(
    absl::string_view name) const {
  return raw_jwt_.GetBooleanClaim(name);
}

bool VerifiedJwt::HasStringClaim(absl::string_view name) const {
  return raw_jwt_.HasStringClaim(name);
}

util::StatusOr<std::string> VerifiedJwt::GetStringClaim(
    absl::string_view name) const {
  return raw_jwt_.GetStringClaim(name);
}

bool VerifiedJwt::HasNumberClaim(absl::string_view name) const {
  return raw_jwt_.HasNumberClaim(name);
}

util::StatusOr<double> VerifiedJwt::GetNumberClaim(
    absl::string_view name) const {
  return raw_jwt_.GetNumberClaim(name);
}

bool VerifiedJwt::HasJsonObjectClaim(absl::string_view name) const {
  return raw_jwt_.HasJsonObjectClaim(name);
}

util::StatusOr<std::string> VerifiedJwt::GetJsonObjectClaim(
    absl::string_view name) const {
  return raw_jwt_.GetJsonObjectClaim(name);
}

bool VerifiedJwt::HasJsonArrayClaim(absl::string_view name) const {
  return raw_jwt_.HasJsonArrayClaim(name);
}

util::StatusOr<std::string> VerifiedJwt::GetJsonArrayClaim(
    absl::string_view name) const {
  return raw_jwt_.GetJsonArrayClaim(name);
}

std::vector<std::string> VerifiedJwt::CustomClaimNames() const {
  return raw_jwt_.CustomClaimNames();
}

util::StatusOr<std::string> VerifiedJwt::GetJsonPayload() {
  return raw_jwt_.GetJsonPayload();
}

}  // namespace tink
}  // namespace crypto
