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

#ifndef FLUTTER_IMPELLER_ARCHIVIST_ARCHIVE_DATABASE_H_
#define FLUTTER_IMPELLER_ARCHIVIST_ARCHIVE_DATABASE_H_

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

#include "impeller/archivist/archive_transaction.h"

namespace impeller {

class ArchiveStatement;
class ArchiveClassRegistration;
struct ArchiveDef;

//------------------------------------------------------------------------------
/// @brief      A handle to the underlying database connection for an archive.
///
class ArchiveDatabase {
 public:
  explicit ArchiveDatabase(const std::string& filename);

  ~ArchiveDatabase();

  bool IsValid() const;

  int64_t GetLastInsertRowID();

  const ArchiveClassRegistration* GetRegistrationForDefinition(
      const ArchiveDef& definition);

  ArchiveTransaction CreateTransaction(int64_t& transactionCount);

 private:
  struct Handle;
  std::unique_ptr<Handle> handle_;
  std::map<std::string, std::unique_ptr<ArchiveClassRegistration>>
      registrations_;
  std::unique_ptr<ArchiveStatement> begin_transaction_stmt_;
  std::unique_ptr<ArchiveStatement> end_transaction_stmt_;
  std::unique_ptr<ArchiveStatement> rollback_transaction_stmt_;

  friend class ArchiveClassRegistration;

  ArchiveStatement CreateStatement(const std::string& statementString) const;

  ArchiveDatabase(const ArchiveDatabase&) = delete;

  ArchiveDatabase& operator=(const ArchiveDatabase&) = delete;
};

}  // namespace impeller

#endif  // FLUTTER_IMPELLER_ARCHIVIST_ARCHIVE_DATABASE_H_
