// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/ledger/cloud_provider_firestore/bin/app/credentials_provider_impl.h"

#include <lib/fit/function.h>

namespace cloud_provider_firestore {

namespace {

class FirebaseAuthPlugin : public grpc::MetadataCredentialsPlugin {
 public:
  explicit FirebaseAuthPlugin(std::string token)
      : header_value_("Bearer " + token) {}

  grpc::Status GetMetadata(
      grpc::string_ref /*service_url*/, grpc::string_ref /*method_name*/,
      const grpc::AuthContext& /*channel_auth_context*/,
      std::multimap<grpc::string, grpc::string>* metadata) override {
    // note: grpc seems to insist on lowercase "authorization", otherwise we get
    // "Illegal header key" from "src/core/lib/surface/validate_metadata.c".
    metadata->insert(std::make_pair("authorization", header_value_));
    return grpc::Status::OK;
  }

 private:
  const std::string header_value_;
};

std::shared_ptr<grpc::CallCredentials> MakeCredentials(std::string token) {
  return grpc::MetadataCredentialsFromPlugin(
      std::make_unique<FirebaseAuthPlugin>(std::move(token)));
}

}  // namespace

CredentialsProviderImpl::CredentialsProviderImpl(
    std::unique_ptr<firebase_auth::FirebaseAuth> firebase_auth)
    : firebase_auth_(std::move(firebase_auth)) {}

CredentialsProviderImpl::~CredentialsProviderImpl() {}

void CredentialsProviderImpl::GetCredentials(
    fit::function<void(std::shared_ptr<grpc::CallCredentials>)> callback) {
  auto request = firebase_auth_->GetFirebaseToken(
      [callback = std::move(callback)](
          firebase_auth::AuthStatus auth_status, std::string auth_token) {
        switch (auth_status) {
          case firebase_auth::AuthStatus::OK:
            callback(MakeCredentials(auth_token));
            return;
          case firebase_auth::AuthStatus::ERROR:
            callback(nullptr);
            return;
        }
      });
  auth_token_requests_.emplace(request);
}

}  // namespace cloud_provider_firestore
