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

#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() = default;

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
