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

#pragma once

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

#include "flutter/fml/macros.h"
#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:
  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;

  FML_DISALLOW_COPY_AND_ASSIGN(ArchiveDatabase);
};

}  // namespace impeller
