// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef DLP_DLP_DATABASE_H_
#define DLP_DLP_DATABASE_H_

#include <stdint.h>

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

#include <base/files/file_path.h>
#include <base/functional/callback.h>
#include <base/task/single_thread_task_runner.h>
#include <base/threading/thread.h>

#include "dlp/dlp_metrics.h"
#include "dlp/file_id.h"

namespace dlp {

// Database for storing information about DLP-protected files.

// |FileEntry| objects stored in |file_entries| table.
// A file entry represents a DLP-protected file. |id| identifies the file on
// the user filesystem, |source_url| and |referrer_url| (possibly empty)
// tell where from the file was originated.
struct FileEntry {
  FileId id;
  std::string source_url;
  std::string referrer_url;
};

class DlpDatabaseDelegate {
 public:
  // Called when an error occurres.
  virtual void OnDatabaseError(DatabaseError error) = 0;

 protected:
  virtual ~DlpDatabaseDelegate() = default;
};

// Provides API to access database and base functions.
// Access to the database is done on a separate thread.
class DlpDatabase : public DlpDatabaseDelegate {
 public:
  class Delegate {
   public:
    // Called when an error occurres.
    virtual void OnDatabaseError(DatabaseError error) = 0;
  };
  // Creates an instance to talk to the database file at |db_path|. Init() must
  // be called to establish connection.
  DlpDatabase(const base::FilePath& db_path, Delegate* delegate);

  // Not copyable or movable.
  DlpDatabase(const DlpDatabase&) = delete;
  DlpDatabase& operator=(const DlpDatabase&) = delete;

  ~DlpDatabase();

  // Initializes database connection. Must be called before any other queries.
  // Returns to the |callback| a pair of result and if migration is pending.
  // Result is |SQLITE_OK| if no error occurred.
  void Init(base::OnceCallback<void(std::pair<int, bool>)> callback);

  // Upserts file_entry into database. Returns true to the |callback| if no
  // error occurred.
  void UpsertFileEntry(const FileEntry& file_entry,
                       base::OnceCallback<void(bool)> callback);

  // Upserts file_entry into the legacy database. Returns true to the |callback|
  // if no error occurred.
  void UpsertLegacyFileEntryForTesting(const FileEntry& file_entry,
                                       base::OnceCallback<void(bool)> callback);

  // Upserts file_entries into database. Returns true to the |callback| if no
  // error occurred.
  void UpsertFileEntries(const std::vector<FileEntry>& file_entries,
                         base::OnceCallback<void(bool)> callback);

  // Gets the file entries by ids. Returns a map of only found entries to
  // the |callback|.
  void GetFileEntriesByIds(
      std::vector<FileId> ids,
      base::OnceCallback<void(std::map<FileId, FileEntry>)> callback) const;

  // Returns all database entries.
  void GetDatabaseEntries(
      base::OnceCallback<void(std::map<FileId, FileEntry>)> callback) const;

  // Deletes file entry with |inode| from database. Returns true to the
  // |callback| if no error occurred.
  void DeleteFileEntryByInode(ino64_t inode,
                              base::OnceCallback<void(bool)> callback);

  // Filters the file entries table to contain only entries with
  // |ids_to_keep| id values. Returns true to the |callback| if no error
  // occurred.
  void DeleteFileEntriesWithIdsNotInSet(
      std::set<FileId> ids_to_keep, base::OnceCallback<void(bool)> callback);

  // Migrates all entries from the old database to the new one, adding crtime
  // base on |existing_files| info.
  void MigrateDatabase(const std::vector<FileId>& existing_files,
                       base::OnceCallback<void(bool)> callback);

 private:
  // DlpDatabaseDelegate overrides:
  void OnDatabaseError(DatabaseError error) override;

  // Class impelmenting the core functionality.
  class Core;

  std::unique_ptr<Core> core_;

  base::Thread database_thread_;
  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;

  Delegate* delegate_;
};

}  // namespace dlp

#endif  // DLP_DLP_DATABASE_H_
