/*
 * Copyright 2020 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 <algorithm>
#include <utility>
#include <vector>

#include "common/libcamera_connector/camera_metadata_utils.h"

namespace cros {

mojom::CameraMetadataEntryPtr* GetMetadataEntry(
    const mojom::CameraMetadataPtr& camera_metadata,
    mojom::CameraMetadataTag tag) {
  if (!camera_metadata || !camera_metadata->entries.has_value()) {
    return nullptr;
  }
  for (auto& entry : camera_metadata->entries.value()) {
    if (entry->tag == tag) {
      return &entry;
    }
  }
  return nullptr;
}

void AddOrUpdateMetadataEntry(mojom::CameraMetadataPtr* to,
                              mojom::CameraMetadataEntryPtr entry) {
  auto* e = GetMetadataEntry(*to, entry->tag);
  if (e) {
    (*to)->data_count += entry->data.size() - (*e)->data.size();
    (*to)->data_capacity = std::max((*to)->data_capacity, (*to)->data_count);
    (*e)->count = entry->count;
    (*e)->data = std::move(entry->data);
  } else {
    entry->index = (*to)->entries->size();
    (*to)->entry_count += 1;
    (*to)->entry_capacity = std::max((*to)->entry_capacity, (*to)->entry_count);
    (*to)->data_count += entry->data.size();
    (*to)->data_capacity = std::max((*to)->data_capacity, (*to)->data_count);
    if (!(*to)->entries) {
      (*to)->entries = std::vector<mojom::CameraMetadataEntryPtr>();
    }
    (*to)->entries->push_back(std::move(entry));
  }
}

void SetFpsRangeInMetadata(mojom::CameraMetadataPtr* settings,
                           int32_t frame_rate) {
  const int32_t entry_length = 2;

  // CameraMetadata is represented as an uint8 array. According to the
  // definition of the FPS metadata tag, its data type is int32, so we
  // reinterpret_cast here.
  std::vector<uint8_t> fps_range(sizeof(int32_t) * entry_length);
  auto* fps_ptr = reinterpret_cast<int32_t*>(fps_range.data());
  fps_ptr[0] = fps_ptr[1] = frame_rate;
  mojom::CameraMetadataEntryPtr e = mojom::CameraMetadataEntry::New();
  e->tag = mojom::CameraMetadataTag::ANDROID_CONTROL_AE_TARGET_FPS_RANGE;
  e->type = mojom::EntryType::TYPE_INT32;
  e->count = entry_length;
  e->data = std::move(fps_range);

  AddOrUpdateMetadataEntry(settings, std::move(e));
}

}  // namespace cros
