#ifndef IMAGE_IO_JPEG_JPEG_IMAGE_EXTRACTOR_H_  // NOLINT
#define IMAGE_IO_JPEG_JPEG_IMAGE_EXTRACTOR_H_  // NOLINT

#include "image_io/base/data_destination.h"
#include "image_io/base/data_source.h"
#include "image_io/jpeg/jpeg_info.h"

namespace photos_editing_formats {
namespace image_io {

/// A class that can make use of the data in a JpegInfo instance to transfer
/// Apple depth and GDepth/GImage images from a DataSource and ship it to a
/// DataDestination.
class JpegImageExtractor {
 public:
  /// @param jpeg_info The JpegInfo instance containing depth/image data.
  /// @param data_source The DataSource from which to transfer depth/image data.
  JpegImageExtractor(const JpegInfo& jpeg_info, DataSource* data_source)
      : jpeg_info_(jpeg_info), data_source_(data_source) {}

  /// This function extracts the Apple depth image from the DataSource and sends
  /// the bytes to the DataDestination.
  /// @param image_destination The DataDestination to receive the image data.
  /// @return True if an image was extracted.
  bool ExtractAppleDepthImage(DataDestination* image_destination);

  /// This function extracts the Apple matte image from the DataSource and sends
  /// the bytes to the DataDestination.
  /// @param image_destination The DataDestination to receive the image data.
  /// @return True if an image was extracted.
  bool ExtractAppleMatteImage(DataDestination* image_destination);

  /// This function extracts the GDepth type image from the DataSource and
  /// sends the bytes to the DataDestination.
  /// @param image_destination The DataDestination to receive the image data.
  /// @return True if an image was extracted.
  bool ExtractGDepthImage(DataDestination* image_destination);

  /// This function extracts the GImage type image from the DataSource and
  /// sends the bytes to the DataDestination.
  /// @param image_destination The DataDestination to receive the image data.
  /// @return True if an image was extracted.
  bool ExtractGImageImage(DataDestination* image_destination);

 private:
  /// Worker function called for GDepth/GImage type image extraction.
  /// @param xmp_info_type The type of image to extract.
  /// @param image_destination The DataDestination to receive the image data.
  /// @return True if an image was extracted.
  bool ExtractImage(JpegXmpInfo::Type xmp_info_type,
                    DataDestination* image_destination);

  /// Worker function called for Apple depth/matte type image extraction.
  /// @param image_range The range of the image data to extract. If invalid,
  ///     the image_destination's StartTransfer/FinishTransfer functions are
  ///     still called, and this function will return true (i.e., zero bytes
  ///     "successfully" transferred).
  /// @param image_destination The DataDestination to receive the image data.
  /// @return True if the transfer succeeded.
  bool ExtractImage(const DataRange& image_range,
                    DataDestination* image_destination);

  /// The jpeg info object contains the location of the Apple and Google images.
  JpegInfo jpeg_info_;

  /// The data source from which the images are extracted.
  DataSource* data_source_;
};

}  // namespace image_io
}  // namespace photos_editing_formats

#endif // IMAGE_IO_JPEG_JPEG_IMAGE_EXTRACTOR_H_  // NOLINT
