// Copyright 2018 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 SCREEN_CAPTURE_UTILS_CRTC_H_
#define SCREEN_CAPTURE_UTILS_CRTC_H_

#include <memory>
#include <utility>
#include <vector>

#include <base/files/file.h>
#include <base/macros.h>
#include <xf86drm.h>
#include <xf86drmMode.h>

#include "screen-capture-utils/ptr_util.h"

namespace screenshot {

struct PlanePosition {
  int32_t x;
  int32_t y;
  uint32_t w;
  uint32_t h;
};

class Crtc {
 public:
  using PlaneInfo = std::pair<ScopedDrmModeFB2Ptr, PlanePosition>;

  Crtc(base::File file,
       ScopedDrmModeConnectorPtr connector,
       ScopedDrmModeEncoderPtr encoder,
       ScopedDrmModeCrtcPtr crtc,
       ScopedDrmModeFBPtr fb,
       ScopedDrmModeFB2Ptr fb2,
       ScopedDrmPlaneResPtr plane_res);

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

  const base::File& file() const { return file_; }
  drmModeConnector* connector() const { return connector_.get(); }
  drmModeEncoder* encoder() const { return encoder_.get(); }
  drmModeCrtc* crtc() const { return crtc_.get(); }

  drmModeFB* fb() const { return fb_.get(); }
  drmModeFB2* fb2() const { return fb2_.get(); }

  uint32_t width() const { return crtc_->width; }
  uint32_t height() const { return crtc_->height; }

  bool IsInternalDisplay() const;
  std::vector<Crtc::PlaneInfo> GetConnectedPlanes() const;

 private:
  base::File file_;
  ScopedDrmModeConnectorPtr connector_;
  ScopedDrmModeEncoderPtr encoder_;
  ScopedDrmModeCrtcPtr crtc_;
  ScopedDrmModeFBPtr fb_;
  ScopedDrmModeFB2Ptr fb2_;
  ScopedDrmPlaneResPtr plane_res_;
};

class CrtcFinder final {
 public:
  enum class Spec {
    kAnyDisplay = 0,
    kInternalDisplay,
    kExternalDisplay,
    kById,
  };

  CrtcFinder() = default;
  ~CrtcFinder() = default;

  inline void SetSpec(Spec spec) { spec_ = spec; }
  inline void SetCrtcId(uint32_t crtc_id) { crtc_id_ = crtc_id; }

  std::unique_ptr<Crtc> Find() const;

 private:
  bool MatchesSpec(const Crtc* crtc) const;

  Spec spec_ = Spec::kAnyDisplay;
  uint32_t crtc_id_;
};

}  // namespace screenshot

#endif  // SCREEN_CAPTURE_UTILS_CRTC_H_
