// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#pragma once

#include "config.hpp"
#include "input.hpp"

#include <vector>

namespace VideoStitch {

namespace Core {

enum class ControllerStatusCode {
  // mandatory status
  Ok,
  ErrorWithStatus,
  // custom stitcher state
  // end of file reached
  EndOfStream
};

typedef Result<ControllerStatusCode> ControllerStatus;

class VS_EXPORT InputController {
 public:
  /**
   * Returns the maximum of the readers' first frame numbers.
   * This is the first frame that can be seeked and stitched.
   */
  virtual frameid_t getFirstReadableFrame() const = 0;

  /**
   * Returns the minimum of the readers' last frame numbers, or NO_LAST_FRAME if unbounded.
   */
  virtual frameid_t getLastReadableFrame() const = 0;

  /**
   * Returns the last frame that can be seeked and stitched, or NO_LAST_FRAME if unbounded.
   * This is not necessarily the same as getLastReadableFrame() because of frame offsets.
   */
  virtual frameid_t getLastStitchableFrame() const = 0;

  /**
   * Returns the reader last frames
   */
  virtual std::vector<frameid_t> getLastFrames() const = 0;

  /**
   * Returns the frame rate of the controller's inputs.
   */
  virtual FrameRate getFrameRate() const = 0;

  /**
   * Reader Spec accessor.
   * @returns The i-th reader spec.
   */
  virtual const Input::VideoReader::Spec& getReaderSpec(int i) const = 0;
};

}  // namespace Core
}  // namespace VideoStitch