// Copyright 2015 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_SUPERVISED_USER_SUPERVISED_USER_BOOKMARKS_HANDLER_H_
#define CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_BOOKMARKS_HANDLER_H_

#include <string>
#include <vector>

#include "base/macros.h"
#include "base/memory/scoped_ptr.h"

namespace base {
class DictionaryValue;
class ListValue;
}

// This class converts bookmarks from supervised user settings into a tree of
// base::Values, for use in bookmarks::prefs::kSupervisedBookmarks.
class SupervisedUserBookmarksHandler {
 public:
  static scoped_ptr<base::ListValue> BuildBookmarksTree(
      const base::DictionaryValue& settings);

  // Public for testing only.
  struct Folder {
    Folder(int id, const std::string& name, int parent_id);

    int id;
    std::string name;
    int parent_id;
  };

  struct Link {
    Link(const std::string& url, const std::string& name, int parent_id);

    std::string url;
    std::string name;
    int parent_id;
  };

 private:
  friend class SupervisedUserBookmarksHandlerTest;

  SupervisedUserBookmarksHandler();
  ~SupervisedUserBookmarksHandler();

  void ParseSettings(const base::DictionaryValue& settings);
  void ParseFolders(const base::DictionaryValue& folders);
  void ParseLinks(const base::DictionaryValue& links);
  scoped_ptr<base::ListValue> BuildTree();
  void AddFoldersToTree();
  void AddLinksToTree();
  bool AddNodeToTree(int parent_id, scoped_ptr<base::DictionaryValue> node);

  const std::vector<Folder>& folders_for_testing() const { return folders_; }
  const std::vector<Link>& links_for_testing() const { return links_; }

  std::vector<Folder> folders_;
  std::vector<Link> links_;

  scoped_ptr<base::ListValue> root_;

  DISALLOW_COPY_AND_ASSIGN(SupervisedUserBookmarksHandler);
};

#endif  // CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_BOOKMARKS_HANDLER_H_