// Copyright 2019 The Fuchsia 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 "src/camera/camera_manager2/video_device_client.h"

#include <fuchsia/camera2/hal/cpp/fidl.h>

#include <sstream>
#include <utility>
#include <vector>

#include <src/lib/syslog/cpp/logger.h>
namespace camera {

std::unique_ptr<VideoDeviceClient> VideoDeviceClient::Create(
    fidl::InterfaceHandle<fuchsia::camera2::hal::Controller> controller) {
  if (!controller.is_valid()) {
    FX_LOGS(ERROR) << " Received invalid InterfaceHandle";
    return nullptr;
  }

  std::unique_ptr<VideoDeviceClient> device(new VideoDeviceClient);
  device->camera_control_.Bind(std::move(controller));

  // Since the interface is synchronous, just gather info here.
  // TODO(41395): Handle the stalled driver scenario so that one bad device
  // doesn't hose the manager.
  auto err = device->GetInitialInfo();
  if (err) {
    FX_PLOGS(ERROR, err) << "Couldn't get configs or info for device";
    return nullptr;
  }

  return device;
}

zx_status_t VideoDeviceClient::CreateStream(
    uint32_t config_index, uint32_t stream_type, uint32_t image_format_index,
    fidl::InterfaceHandle<fuchsia::sysmem::BufferCollection> sysmem_collection,
    fidl::InterfaceRequest<fuchsia::camera2::Stream> stream) {
  if (config_index >= configs_.size()) {
    FX_LOGS(WARNING) << "Requested config " << config_index << " Does not exist.";
    return ZX_ERR_INVALID_ARGS;
  }
  if (stream_type >= configs_[config_index].stream_configs.size()) {
    FX_LOGS(ERROR) << "Requested  stream " << stream_type << " of config " << config_index
                   << " Does not exist.";
    return ZX_ERR_INVALID_ARGS;
  }
  if (image_format_index >=
      configs_[config_index].stream_configs[stream_type].image_formats.size()) {
    FX_LOGS(ERROR) << "Requested image format " << image_format_index << " of stream "
                   << stream_type << " of config " << config_index << " Does not exist.";
    return ZX_ERR_INVALID_ARGS;
  }
  if (!sysmem_collection.is_valid()) {
    FX_LOGS(ERROR) << " Received invalid InterfaceHandle for buffer collection.";
    return ZX_ERR_INVALID_ARGS;
  }
  auto sysmem_collection_ptr = sysmem_collection.BindSync();
  auto &stream_config = configs_[config_index].stream_configs[stream_type];
  zx_status_t status = sysmem_collection_ptr->SetConstraints(true, stream_config.constraints);
  if (status) {
    FX_PLOGS(ERROR, status) << "SetContraints failed";
    return status;
  }

  zx_status_t allocation_status = ZX_OK;
  fuchsia::sysmem::BufferCollectionInfo_2 buffer_collection_info{};
  status =
      sysmem_collection_ptr->WaitForBuffersAllocated(&allocation_status, &buffer_collection_info);
  if (allocation_status != ZX_OK) {
    FX_PLOGS(ERROR, allocation_status) << "Failed to allocate buffers.";
    return allocation_status;
  }
  if (status != ZX_OK) {
    FX_PLOGS(ERROR, status) << "WaitForBuffersAllocated failed";
    return status;
  }

  status = camera_control_->CreateStream(config_index, stream_type, image_format_index,
                                         std::move(buffer_collection_info), std::move(stream));
  if (status != ZX_OK) {
    FX_PLOGS(ERROR, status) << "Failed to call CreateStream.";
    return status;
  }

  // Close any buffer collections related to streams that exist from other configs.
  // Do this after the stream is set up, because the driver will be the one closing
  // the stream channel.
  // Also, for now close any stream with the same config and stream type:
  auto should_remove = [config_index, stream_type](const Stream &stream) {
    return stream.config_index != config_index ||
           (stream.config_index == config_index && stream.stream_type == stream_type);
  };
  // Call Close() on the streams first:
  for (auto &stream : open_streams_) {
    if (should_remove(stream) && stream.sysmem_collection.is_bound()) {
      FX_LOGS(INFO) << "Closing previously active stream with config " << stream.config_index
                    << " and stream type " << stream.stream_type;
      stream.sysmem_collection->Close();
    }
  }
  open_streams_.remove_if(should_remove);

  // Finally, add the newly created stream to open_streams_:
  open_streams_.push_back({config_index, stream_type, std::move(sysmem_collection_ptr)});
  return ZX_OK;
}

zx_status_t VideoDeviceClient::MatchConstraints(
    const fuchsia::camera2::StreamConstraints &constraints, uint32_t *config_index,
    uint32_t *stream_type) {
  // match first stream that has same stream type:
  if (!constraints.has_properties() || !constraints.properties().has_stream_type()) {
    FX_LOGS(ERROR) << "Constraints did not contain a stream type.";
    return ZX_ERR_INVALID_ARGS;
  }

  auto requested_stream_type = constraints.properties().stream_type();
  std::vector<std::pair<uint32_t, uint32_t>> matches;
  for (uint32_t i = 0; i < configs_.size(); ++i) {
    auto &config = configs_[i];
    for (uint32_t j = 0; j < config.stream_configs.size(); ++j) {
      auto &stream = config.stream_configs[j];
      if (stream.properties.has_stream_type() &&
          stream.properties.stream_type() == requested_stream_type) {
        if (!constraints.has_format_index() ||
            constraints.format_index() < stream.image_formats.size()) {
          matches.emplace_back(i, j);
        }
      }
    }
  }

  if (matches.empty()) {
    FX_LOGS(ERROR) << "Stream type " << static_cast<uint32_t>(requested_stream_type)
                   << " unsupported";
    return ZX_ERR_NO_RESOURCES;
  }

  if (matches.size() > 1) {
    std::stringstream ss;
    ss << "Driver reported multiple streams of same type "
       << static_cast<uint32_t>(requested_stream_type) << ":";
    for (const auto &match : matches) {
      ss << "\n  config " << match.first << ", stream " << match.second;
    }
    FX_LOGS(ERROR) << ss.str();
    return ZX_ERR_INTERNAL;
  }

  *config_index = matches[0].first;
  *stream_type = matches[0].second;

  return ZX_OK;
}

zx_status_t VideoDeviceClient::GetInitialInfo() {
  zx_status_t out_status;
  fidl::VectorPtr<fuchsia::camera2::hal::Config> out_configs;
  auto err = camera_control_->GetConfigs(&out_configs, &out_status);
  if (err) {
    FX_PLOGS(ERROR, err) << "Couldn't get Camera Configs";
    return err;
  }
  if (out_status != ZX_OK) {
    FX_PLOGS(ERROR, out_status) << "Couldn't get Camera Configs";
    return out_status;
  }
  if (!out_configs) {
    FX_LOGS(ERROR) << "Couldn't get Camera Configs. No Configs.";
    return ZX_ERR_INTERNAL;
  }

  // Check the configs for validity:
  // 1) The configs vector must not be empty.
  // 2) Each config must have at least one stream_config.
  // 3) Each stream must have a stream_type in properties.
  // 4) Each stream must have at least one image_format.
  if (out_configs->empty()) {
    FX_LOGS(ERROR) << "Couldn't get Camera Configs. Empty set of configs received.";
    return ZX_ERR_INTERNAL;
  }

  uint32_t config_index = 0;
  for (auto &config : configs_) {
    if (config.stream_configs.empty()) {
      FX_LOGS(ERROR) << "Error with Camera Configs. Config " << config_index << " has no streams.";
      return ZX_ERR_INTERNAL;
    }
    uint32_t stream_index = 0;
    for (auto &stream : config.stream_configs) {
      if (!stream.properties.has_stream_type()) {
        FX_LOGS(ERROR) << "Error with Camera Configs. Config " << config_index << ", stream "
                       << stream_index << " has no properties.";
        return ZX_ERR_INTERNAL;
      }
      if (stream.image_formats.empty()) {
        FX_LOGS(ERROR) << "Error with Camera Configs. Config " << config_index << ", stream "
                       << stream_index << " has no image formats.";
        return ZX_ERR_INTERNAL;
      }
      ++stream_index;
    }
    ++config_index;
  }

  // now we have configs, copy the vector to member variable.
  configs_ = std::move(out_configs.value());

  err = camera_control_->GetDeviceInfo(&device_info_);
  if (err) {
    FX_PLOGS(ERROR, err) << "Couldn't get device info for device ";
    return err;
  }
  return ZX_OK;
}

}  // namespace camera
