// Copyright 2013 The Flutter 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 PACKAGES_CAMERA_CAMERA_WINDOWS_WINDOWS_PHOTO_HANDLER_H_
#define PACKAGES_CAMERA_CAMERA_WINDOWS_WINDOWS_PHOTO_HANDLER_H_

#include <mfapi.h>
#include <mfcaptureengine.h>
#include <wrl/client.h>

#include <memory>
#include <string>

#include "capture_engine_listener.h"

namespace camera_windows {
using Microsoft::WRL::ComPtr;

// Various states that the photo handler can be in.
//
// When created, the handler is in |kNotStarted| state and transtions in
// sequential order through the states.
enum class PhotoState {
  kNotStarted,
  kIdle,
  kTakingPhoto,
};

// Handles photo sink initialization and tracks photo capture states.
class PhotoHandler {
 public:
  PhotoHandler() {}
  virtual ~PhotoHandler() = default;

  // Prevent copying.
  PhotoHandler(PhotoHandler const&) = delete;
  PhotoHandler& operator=(PhotoHandler const&) = delete;

  // Initializes photo sink if not initialized and requests the capture engine
  // to take photo.
  //
  // Sets photo state to: kTakingPhoto.
  // Returns false if photo cannot be taken.
  //
  // capture_engine:  A pointer to capture engine instance.
  //                  Called to take the photo.
  // base_media_type: A pointer to base media type used as a base
  //                  for the actual photo capture media type.
  // file_path:       A string that hold file path for photo capture.
  bool TakePhoto(const std::string& file_path, IMFCaptureEngine* capture_engine,
                 IMFMediaType* base_media_type);

  // Set the photo handler recording state to: kIdle.
  void OnPhotoTaken();

  // Returns true if photo state is kIdle.
  bool IsInitialized() const { return photo_state_ == PhotoState::kIdle; }

  // Returns true if photo state is kTakingPhoto.
  bool IsTakingPhoto() const {
    return photo_state_ == PhotoState::kTakingPhoto;
  }

  // Returns the filesystem path of the captured photo.
  std::string GetPhotoPath() const { return file_path_; }

 private:
  // Initializes record sink for video file capture.
  HRESULT InitPhotoSink(IMFCaptureEngine* capture_engine,
                        IMFMediaType* base_media_type);

  std::string file_path_;
  PhotoState photo_state_ = PhotoState::kNotStarted;
  ComPtr<IMFCapturePhotoSink> photo_sink_;
};

}  // namespace camera_windows

#endif  // PACKAGES_CAMERA_CAMERA_WINDOWS_WINDOWS_PHOTO_HANDLER_H_
