/*
 * Copyright 2019 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_COMMON_VENDOR_TAG_MANAGER_H_
#define CAMERA_COMMON_VENDOR_TAG_MANAGER_H_

#include <cstdint>
#include <map>
#include <set>
#include <string>

#include "system/camera_vendor_tags.h"

namespace cros {

// These are half-closed intervals as [kFooStart, kFooEnd).
const uint32_t kReprocessEffectVendorTagStart = 0x80000000;
const uint32_t kReprocessEffectVendorTagEnd = 0x80010000;

const uint32_t kUsbHalVendorTagStart = 0x80010000;
const uint32_t kUsbHalVendorTagEnd = 0x80020000;

// Please update this value when allocating a new interval, such as
// const uint32_t kFooVendorTagStart = {value of kNextAvailableVendorTag};
// const uint32_t kFooVendorTagEnd = ...;
// const uint32_t kNextAvailableVendorTag = {value of kFooVendorTagEnd};
const uint32_t kNextAvailableVendorTag = 0x80020000;

class VendorTagManager : public vendor_tag_ops_t {
 public:
  VendorTagManager();
  VendorTagManager(const VendorTagManager&) = default;
  VendorTagManager& operator=(const VendorTagManager&) = default;
  ~VendorTagManager() = default;

  // The functions for querying the tags and implementing |vendor_tag_ops_t|.
  int GetTagCount() const;
  void GetAllTags(uint32_t* tag_array) const;
  const char* GetSectionName(uint32_t tag) const;
  const char* GetTagName(uint32_t tag) const;
  int GetTagType(uint32_t tag) const;

  // The static version of vendor_tag_ops_t implementations.
  static int get_tag_count(const vendor_tag_ops_t* v);
  static void get_all_tags(const vendor_tag_ops_t* v, uint32_t* tag_array);
  static const char* get_section_name(const vendor_tag_ops_t* v, uint32_t tag);
  static const char* get_tag_name(const vendor_tag_ops_t* v, uint32_t tag);
  static int get_tag_type(const vendor_tag_ops_t* v, uint32_t tag);

  // Adds all tags defined in |ops|. Returns true on success.
  bool Add(vendor_tag_ops_t* ops);

  // Adds a tag. Returns true on success.
  bool Add(uint32_t tag,
           const std::string& section_name,
           const std::string& tag_name,
           int type);

 private:
  struct TagInfo {
    std::string section_name;
    std::string tag_name;
    int type;
  };

  std::map<uint32_t, TagInfo> tags_;
  std::set<std::string> full_names_;
};

}  // namespace cros

#endif  // CAMERA_COMMON_VENDOR_TAG_MANAGER_H_
