// Copyright 2017 The Fuchsia Authors
//
// 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.

#ifndef COBALT_ANALYZER_STORE_BIGTABLE_STORE_H_
#define COBALT_ANALYZER_STORE_BIGTABLE_STORE_H_

#include <google/bigtable/admin/v2/bigtable_table_admin.grpc.pb.h>
#include <google/bigtable/v2/bigtable.grpc.pb.h>
#include <grpc++/grpc++.h>

#include <map>
#include <memory>
#include <string>
#include <vector>

#include "analyzer/store/data_store.h"

namespace cobalt {
namespace analyzer {
namespace store {

// An implementation of DataStore backed by Google Cloud Bigtable
class BigtableStore : public DataStore {
 public:
  // Creates and returns an instance of BigtableStore using the well-known
  // URI of Google Cloud Bigtable, credentials for for the Cobalt service
  // account read from the file named in the environment variable
  // GOOGLE_APPLICATION_CREDENTIALS, and the project and instance
  // names read from flags.
  static std::unique_ptr<BigtableStore> CreateFromFlagsOrDie();

  BigtableStore(const std::string& uri, const std::string& admin_uri,
                std::shared_ptr<grpc::ChannelCredentials> credentials,
                const std::string& project_name,
                const std::string& instance_id);

  Status WriteRow(Table table, DataStore::Row row) override;

  Status WriteRows(Table table, std::vector<Row> rows) override;

  Status ReadRow(Table table, const std::vector<std::string>& column_names,
                 Row* row) override;

  ReadResponse ReadRows(Table table, std::string start_row_key, bool inclusive,
                        std::string limit_row_key,
                        const std::vector<std::string>& column_names,
                        size_t max_rows) override;

  Status DeleteRow(Table table, std::string row_key) override;

  Status DeleteRowsWithPrefix(Table table, std::string row_key_prefix) override;

  Status DeleteAllRows(Table table) override;

 private:
  std::string TableName(DataStore::Table table);

  // DoWriteRows does the work of WriteRows(). WriteRows() invokes DoWriteRows()
  // in a loop, retrying with exponential backoff when a retryable error occurs.
  grpc::Status DoWriteRows(Table table, const std::vector<Row>& rows);

  // This method invokes ReadRowsInternal() multiple times until it succeeds,
  // returns a non-retryable error, or exceeds a maximum number of attempts.
  ReadResponse ReadRowsWithRetry(Table table, std::string start_row_key,
                                 bool inclusive_start, std::string end_row_key,
                                 bool inclusive_end,
                                 const std::vector<std::string>& column_names,
                                 size_t max_rows);

  // This method is used to implement ReadRow and ReadRows. It is identical to
  // ReadRows except that instead of limit_row_key it has end_row_key and
  // inclusive_end. In other words it supports intervals that are closed on
  // the right.
  ReadResponse ReadRowsInternal(Table table, std::string start_row_key,
                                bool inclusive_start, std::string end_row_key,
                                bool inclusive_end,
                                const std::vector<std::string>& column_names,
                                size_t max_rows);

  std::unique_ptr<google::bigtable::v2::Bigtable::Stub> stub_;
  std::unique_ptr<google::bigtable::admin::v2::BigtableTableAdmin::Stub>
      admin_stub_;
  std::string observations_table_name_, report_progress_table_name_,
      report_rows_table_name_;
};

}  // namespace store
}  // namespace analyzer
}  // namespace cobalt

#endif  // COBALT_ANALYZER_STORE_BIGTABLE_STORE_H_
