// Copyright (c) 2012 The Chromium 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 CHROME_BROWSER_UI_WEBUI_COOKIES_TREE_MODEL_UTIL_H_
#define CHROME_BROWSER_UI_WEBUI_COOKIES_TREE_MODEL_UTIL_H_

#include <stdint.h>

#include <map>
#include <string>

#include "base/containers/id_map.h"
#include "base/macros.h"
#include "base/strings/string16.h"

class CookieTreeNode;

namespace base {
class DictionaryValue;
class ListValue;
}

class CookiesTreeModelUtil {
 public:
  CookiesTreeModelUtil();
  ~CookiesTreeModelUtil();

  // Finds or creates an ID for given |node| and returns it as string.
  std::string GetTreeNodeId(const CookieTreeNode* node);

  // Append the details of the child nodes of |parent| in specified range.
  void GetChildNodeDetails(const CookieTreeNode* parent,
                           int start,
                           int count,
                           bool include_quota_nodes,
                           base::ListValue* list);

  // Append the children nodes of |parent| in specified range to |nodes| list.
  void GetChildNodeList(const CookieTreeNode* parent,
                        int start,
                        int count,
                        bool include_quota_nodes,
                        base::ListValue* nodes);

  // Gets tree node from |path| under |root|. |path| is comma separated list of
  // ids. |id_map| translates ids into object pointers. Return NULL if |path|
  // is not valid.
  const CookieTreeNode* GetTreeNodeFromPath(const CookieTreeNode* root,
                                            const std::string& path);

  // Gets tree node from |title| under |root|. |title| is a node title. Return
  // NULL if |title| is not found.
  const CookieTreeNode* GetTreeNodeFromTitle(const CookieTreeNode* root,
                                             const base::string16& title);

 private:
  using CookiesTreeNodeIdMap = base::IDMap<const CookieTreeNode*>;
  using CookieTreeNodeMap = std::map<const CookieTreeNode*, int32_t>;

  // Populate given |dict| with cookie tree node properties. |id_map| maps
  // a CookieTreeNode to an ID and creates a new ID if |node| is not in the
  // maps. Returns false if the |node| does not need to be shown.
  bool GetCookieTreeNodeDictionary(const CookieTreeNode& node,
                                   bool include_quota_nodes,
                                   base::DictionaryValue* dict);

  // IDMap to create unique ID and look up the object for an ID.
  CookiesTreeNodeIdMap id_map_;

  // Reverse look up map to find the ID for a node.
  CookieTreeNodeMap node_map_;

  DISALLOW_COPY_AND_ASSIGN(CookiesTreeModelUtil);
};

#endif  // CHROME_BROWSER_UI_WEBUI_COOKIES_TREE_MODEL_UTIL_H_
