// Copyright 2020 The Chromium OS 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 UREADAHEAD_DIFF_UREADAHEAD_DIFF_H_
#define UREADAHEAD_DIFF_UREADAHEAD_DIFF_H_

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

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

namespace ureadahead_diff {

// Constants and definitions from ureadhead/src/pack.*
#define PACK_PATH_MAX 255

enum PackFlags {
  PACK_ROTATIONAL = 0x01,
};

// Keep it as declared in pack.h. Default alignment must be used.
struct PackPath {
  int group;
  ino_t ino;
  char path[PACK_PATH_MAX + 1];

  bool operator==(const PackPath& other) const;
  bool operator!=(const PackPath& other) const;
};

// Keep it as declared in pack.h. Default alignment must be used.
struct PackBlock {
  size_t pathidx;
  off_t offset;
  off_t length;
  off_t physical;

  bool operator==(const PackBlock& other) const;
  bool operator!=(const PackBlock& other) const;
};

// Represents individual file in ureadahead pack file.
class FileEntry {
 public:
  explicit FileEntry(const PackPath& pack_path);
  ~FileEntry();

  FileEntry(const FileEntry&) = delete;
  FileEntry& operator=(const FileEntry&) = delete;

  // Builds |FileEntry| based on provided read requests. Each request is
  // std::pair of offset and length of the each read operation.
  void BuildFromReadRequests(const std::vector<PackBlock>& read_requests);

  // Returns read request that is calculated from |read_map_|. |pathidx|
  // specifies the global index for this file.
  std::vector<PackBlock> GetReadRequests(size_t pathidx) const;

  // Returns true if file does not have any read block.
  bool IsEmpty() const;

  // Calculates difference of two files. It puts the common part into |common|
  // and leaves difference in |file1| and |file2] correspondingly. Note, that
  // sizes of read requests might be different and |common| will have the size
  // of minimum of read requests sizes of |file1| and |file2|.
  static void CalculateDifference(
      FileEntry* file1, FileEntry* file2, FileEntry* common);

  const PackPath& pack_path() const { return pack_path_; }

 private:
  using ReadMap = std::vector<bool>;

  const PackPath pack_path_;

  // Each bit in the collections corresponds one page of file.
  ReadMap read_map_;
};

// Represents ureadahead pack.
class Pack {
 public:
  // Source pack specifies the source pack and output specifies pack that
  // contains difference.
  Pack();
  ~Pack();

  Pack(const Pack&) = delete;
  Pack& operator=(const Pack&) = delete;

  // Returns the number of files in the pack.
  size_t GetFileCount() const;

  // Returns file by index.
  FileEntry* GetFile(size_t index);

  // Adds file to the pack.
  void AddFile(std::unique_ptr<FileEntry> file);

  // Finds the file in this pack that corresponds to the provided |other_file|
  // which may belong to the different pack. Returns nullptr if match is not
  // found.
  FileEntry* FindFile(FileEntry* other_file);

  // Reads ureadahead pack from |path|.
  bool Read(const std::string& path);

  // Writes pack to the |path|.
  bool Write(const std::string& path) const;

  // Removes all files that do not have read operations.
  void TrimEmptyFiles();

  // Calculates difference of two packs. It puts the common part into |common|
  // and leaves difference in |pack1| and |pack2] correspondingly.
  static void CalculateDifference(Pack* pack1, Pack* pack2, Pack* common);

 private:
  bool Read(int fd);
  bool Write(int fd) const;

  // Mapped from ureadahead's struct pack_file.
  dev_t dev_ = 0;

  std::vector<std::unique_ptr<FileEntry>> files_;
};

}  // namespace ureadahead_diff

#endif  // UREADAHEAD_DIFF_UREADAHEAD_DIFF_H_
