// Copyright 2021 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.

#include <stdlib.h>

#include <algorithm>
#include <iostream>
#include <memory>
#include <vector>

#include <base/bind.h>
#include <base/callback.h>
#include <base/logging.h>
#include <brillo/flag_helper.h>
#include <brillo/syslog_logging.h>
#include "media_capabilities/camera.h"
#include "media_capabilities/common.h"

#if defined(USE_V4L2_CODEC)
#include "media_capabilities/v4l2.h"
#endif  // defined(USE_V4L2_CODEC)

#if defined(USE_VAAPI)
#include "media_capabilities/vaapi.h"
#endif  // defined(USE_VAAPI)

int main(int argc, char* argv[]) {
  DEFINE_int32(log_level, 0,
               "Logging level - 0: LOG(INFO), 1: LOG(WARNING), 2: LOG(ERROR), "
               "-1: VLOG(1), -2: VLOG(2), ...");
  brillo::FlagHelper::Init(
      argc, argv, "Command line tool to detect video and camera capabilities");
  brillo::InitLog(brillo::kLogToStderrIfTty);
  logging::SetMinLogLevel(FLAGS_log_level);

  using DetectFunction = base::RepeatingCallback<std::vector<Capability>()>;
  const DetectFunction kDetectFunctions[] = {
#if defined(USE_V4L2_CODEC)
    base::BindRepeating(&DetectV4L2Capabilities),
#endif  // defined(USE_V4L2_CODEC)
#if defined(USE_VAAPI)
    base::BindRepeating(&DetectVaapiCapabilities),
#endif  // defined(USE_VAAPI)
    base::BindRepeating(&DetectCameraCapabilities),
  };

  std::vector<Capability> capabilities;
  for (const DetectFunction& detect_function : kDetectFunctions) {
    for (const auto& cap : detect_function.Run())
      capabilities.push_back(cap);
  }

  // Remove duplicated capabilities to not print the same capability multiple
  // times when the same capabilities are available in V4L2 API and VA-API.
  std::sort(capabilities.begin(), capabilities.end());
  auto last = std::unique(capabilities.begin(), capabilities.end());
  capabilities.erase(last, capabilities.end());
  for (const auto& cap : capabilities)
    std::cout << cap.ToString() << std::endl;
}
