// Copyright 2018 The Chromium 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 CONTENT_BROWSER_INDEXED_DB_SCOPES_LEVELDB_SCOPES_CODING_H_
#define CONTENT_BROWSER_INDEXED_DB_SCOPES_LEVELDB_SCOPES_CODING_H_

#include <stdint.h>
#include <limits>
#include <string>
#include <tuple>
#include <vector>

#include "base/containers/span.h"
#include "content/common/content_export.h"
#include "third_party/leveldatabase/src/include/leveldb/slice.h"

namespace content {
namespace leveldb_scopes {

// TODO(dmurph): Replace all of the 'static' keywords with 'inline' when
// chromium is updated to C++17.

static constexpr uint8_t kGlobalMetadataByte = 0x00;
static constexpr uint8_t kScopesMetadataByte = 0x01;
static constexpr uint8_t kLogByte = 0x02;

// One of these bytes follows the |kLogByte| to specify whether the log is for
// undo tasks or a cleanup tasks.
static constexpr uint8_t kUndoTasksByte = 0x00;
static constexpr uint8_t kCleanupTasksByte = 0x01;

static constexpr int64_t kMinSupportedVersion = 1;
static constexpr int64_t kCurrentVersion = 1;

static constexpr int64_t kFirstScopeNumber = 0;
static constexpr int64_t kFirstSequenceNumberToWrite =
    std::numeric_limits<int64_t>::max();

CONTENT_EXPORT std::tuple<bool /*success*/, int64_t /*scope_id*/>
ParseScopeMetadataId(leveldb::Slice key,
                     base::span<const uint8_t> scopes_prefix);

}  // namespace leveldb_scopes

// This class helps the re-use of a common std::string buffer. All calls modify
// the internal std::string buffer and return a slice to it.
// Important: Every call to this class will invalidate any 'old' slices that
// were returned by previous calls.
class CONTENT_EXPORT ScopesEncoder {
 public:
  ScopesEncoder() = default;
  ~ScopesEncoder() = default;

  // The value on disk is expected to be a LevelDBScopesMetadata.
  leveldb::Slice GlobalMetadataKey(base::span<const uint8_t> scopes_prefix);

  // The value on disk  is expected to be a LevelDBScopesScopeMetadata.
  leveldb::Slice ScopeMetadataKey(base::span<const uint8_t> scopes_prefix,
                                  int64_t scope_number);

  // Returns a key prefix that only scope metadata keys use. This is intended to
  // be used to initialize a LevelDB iterator, where advancing the iterator
  // enumerates all metadata entries. Each metadata entry value is expected to
  // be a LevelDBScopesScopeMetadata.
  leveldb::Slice ScopeMetadataPrefix(base::span<const uint8_t> scopes_prefix);

  // Returns a key prefix for all scope tasks for all scopes. This is intended
  // to be used for unit tests which test for the presence of any scope task
  // data after all cleanup has finished.
  leveldb::Slice TasksKeyPrefix(base::span<const uint8_t> scopes_prefix);

  // Returns a key prefix that only scope tasks keys for the given
  // |scope_number| use. This is intended to be used to delete all tasks, or
  // create an iterator for all tasks. There are two task types under this
  // prefix, undo tasks and cleanup tasks.
  leveldb::Slice TasksKeyPrefix(base::span<const uint8_t> scopes_prefix,
                                int64_t scope_number);

  // Returns a key prefix is only scoped to 'undo' tasks keys for the given
  // |scope_number| use. This is intended to be used to initialize a LevelDB
  // iterator, where advancing the iterator enumerates all of the tasks for the
  // given |scope_number|. The task value is expected to be a
  // LevelDBScopesUndoTask.
  leveldb::Slice UndoTaskKeyPrefix(base::span<const uint8_t> scopes_prefix,
                                   int64_t scope_number);

  // Returns a key prefix is only scoped to 'cleanup' tasks keys for the given
  // |scope_number| use. This is intended to be used to initialize a LevelDB
  // iterator, where advancing the iterator enumerates all of the tasks for the
  // given |scope_number|.  The task value is expected to be a
  // LevelDBScopesCleanupTask.
  leveldb::Slice CleanupTaskKeyPrefix(base::span<const uint8_t> scopes_prefix,
                                      int64_t scope_number);

  // The value on disk is expected to be a LevelDBScopesUndoTask.
  leveldb::Slice UndoTaskKey(base::span<const uint8_t> scopes_prefix,
                             int64_t scope_number,
                             int64_t undo_sequence_number);

  // The value on disk is expected to be a LevelDBScopesCleanupTask.
  leveldb::Slice CleanupTaskKey(base::span<const uint8_t> scopes_prefix,
                                int64_t scope_number,
                                int64_t cleanup_sequence_number);

 private:
  std::string key_buffer_;
};

}  // namespace content

#endif  // CONTENT_BROWSER_INDEXED_DB_SCOPES_LEVELDB_SCOPES_CODING_H_
