// Copyright 2020 The Fuchsia 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 SRC_STORAGE_VOLUME_IMAGE_PARTITION_H_
#define SRC_STORAGE_VOLUME_IMAGE_PARTITION_H_

#include <memory>
#include <string>

#include "lib/fit/result.h"
#include "src/storage/volume_image/address_descriptor.h"
#include "src/storage/volume_image/utils/reader.h"
#include "src/storage/volume_image/volume_descriptor.h"

namespace storage::volume_image {

// A Partition consists of the volume descriptor, allowing the fvm to know how the partition should
// look, an address descriptor allowing the fvm to know how the volume data should be moved in the
// fvm address space and last a reader, which provides access to the volume data in the volume
// address space.
//
// This class is move constructible and move assignable only.
// This class is thread-compatible.
class Partition {
 public:
  // Defines a strict and unique ordering between unique partitions.
  //
  // Partitions are first ordered lexicographically by name, and then instance GUID.
  struct LessThan {
    // Returns true if |lhs| partition should be before |rhs| partition.
    bool operator()(const Partition& lhs, const Partition& rhs) const;
  };

  // On success returns a Partition representing the serialized volume image, which contains the
  // volume and address descriptors, and backed by |reader|. On error retruns a string describing
  // the failure reason.
  static fit::result<Partition, std::string> Create(std::string_view serialized_volume_image,
                                                    std::unique_ptr<Reader> reader);

  Partition() = default;
  Partition(VolumeDescriptor volume_descriptor, AddressDescriptor address_descriptor,
            std::unique_ptr<Reader> reader)
      : volume_(std::move(volume_descriptor)),
        address_(std::move(address_descriptor)),
        reader_(std::move(reader)) {}
  Partition(const Partition&) = delete;
  Partition(Partition&&) noexcept = default;
  Partition& operator=(const Partition&) = delete;
  Partition& operator=(Partition&&) noexcept = default;
  ~Partition() = default;

  // Returns the volume descriptor for this partition.
  const VolumeDescriptor& volume() const { return volume_; }

  // Returns the address descriptor for this partition.
  const AddressDescriptor& address() const { return address_; }

  // Returns the reader for this partition, which allows reading the volume data from the source
  // address space.
  const Reader* reader() const { return reader_.get(); }

 private:
  // Information about the volume in this partition.
  VolumeDescriptor volume_;

  // Information about the address or extents in this partitions and how to map them to target
  // space.
  AddressDescriptor address_;

  // Mechanism for reading volume data.
  std::unique_ptr<Reader> reader_ = nullptr;
};

}  // namespace storage::volume_image

#endif  // SRC_STORAGE_VOLUME_IMAGE_PARTITION_H_
