/*
 * 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 CAMERA_HAL_ADAPTER_REPROCESS_EFFECT_REPROCESS_EFFECT_MANAGER_H_
#define CAMERA_HAL_ADAPTER_REPROCESS_EFFECT_REPROCESS_EFFECT_MANAGER_H_

#include <memory>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>

#include <system/camera_vendor_tags.h>

#include "cros-camera/camera_buffer_manager.h"
#include "cros-camera/camera_mojo_channel_manager_token.h"
#include "hal_adapter/reprocess_effect/portrait_mode_effect.h"
#include "hal_adapter/reprocess_effect/reprocess_effect.h"

namespace cros {

// TODO(shik): Change this to "com.google.reprocessEffect".
const char kVendorGoogleSectionName[] = "com.google";

class ReprocessEffectManager : public vendor_tag_ops_t {
 public:
  ReprocessEffectManager();
  ReprocessEffectManager(const ReprocessEffectManager&) = delete;
  ReprocessEffectManager& operator=(const ReprocessEffectManager&) = delete;

  ~ReprocessEffectManager() = default;

  int32_t Initialize(CameraMojoChannelManagerToken* token);

  // Check whether there are vendor tags for reprocessing effects
  bool HasReprocessEffectVendorTag(const camera_metadata_t& settings);

  // Set the vendor tags for reprocessing effects in static metadata.
  void UpdateStaticMetadata(android::CameraMetadata* metadata);

  // Handle the reprocessing request.  It returns -ENOENT error if no
  // corresponding vendor tag is found in |settings|.  On success, it stores
  // result vendor tags into |result_metadata| and the caller should merge them
  // into the result metadata of capture result.
  int32_t ReprocessRequest(const camera_metadata_t& settings,
                           ScopedYUVBufferHandle* input_buffer,
                           uint32_t width,
                           uint32_t height,
                           android::CameraMetadata* result_metadata,
                           ScopedYUVBufferHandle* output_buffer);

  // vendor_tag_ops_t implementations.
  static int GetTagCount(const vendor_tag_ops_t* v);
  static void GetAllTags(const vendor_tag_ops_t* v, uint32_t* tag_array);
  static const char* GetSectionName(const vendor_tag_ops_t* v, uint32_t tag);
  static const char* GetTagName(const vendor_tag_ops_t* v, uint32_t tag);
  static int GetTagType(const vendor_tag_ops_t* v, uint32_t tag);

 private:
  struct VendorTagEffectInfo {
    VendorTagEffectInfo(const VendorTagInfo v, ReprocessEffect* e)
        : vendor_tag_info(v), effect(e) {}
    const VendorTagInfo vendor_tag_info;
    // Pointing to the reprocessing effect that allocates this request vendor
    // tag, or nullptr if this is a result vendor tag.
    ReprocessEffect* effect;
  };

  // Map of vendor tag and effect info with vendor tag as the key.  In the
  // future, we may want to move the management of vendor tags out when
  // reprocessing effect manager is not the sole user of vendor tags.
  std::unordered_map<uint32_t, VendorTagEffectInfo> vendor_tag_effect_info_map_;

  // Next available vendor tag
  uint32_t next_vendor_tag_;

  CameraBufferManager* buffer_manager_;

  std::unique_ptr<PortraitModeEffect> portrait_mode_;
};

}  // namespace cros

#endif  // CAMERA_HAL_ADAPTER_REPROCESS_EFFECT_REPROCESS_EFFECT_MANAGER_H_
