// 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_CHROMEOS_CONTACTS_CONTACT_MAP_H_
#define CHROME_BROWSER_CHROMEOS_CONTACTS_CONTACT_MAP_H_

#include <map>
#include <string>

#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "base/stl_util.h"
#include "base/time/time.h"

namespace contacts {

class Contact;

// Stores Contact objects indexed by their IDs.
class ContactMap {
 public:
  typedef std::map<std::string, Contact*> Map;
  typedef Map::const_iterator const_iterator;

  // What should Merge() do when passed a deleted contact?
  enum DeletedContactPolicy {
    // The deleted contact will be inserted into the map.
    KEEP_DELETED_CONTACTS,

    // The deleted contact will not be deleted from the map, and if there is a
    // previous version of the now-deleted contact already in the map, it will
    // also be removed.
    DROP_DELETED_CONTACTS,
  };

  ContactMap();
  ~ContactMap();

  bool empty() const { return contacts_.empty(); }
  size_t size() const { return contacts_.size(); }
  const_iterator begin() const { return contacts_.begin(); }
  const_iterator end() const { return contacts_.end(); }

  // Returns the contact with ID |contact_id|.  NULL is returned if the contact
  // isn't present.
  const Contact* Find(const std::string& contact_id) const;

  // Deletes the contact with ID |contact_id|.
  void Erase(const std::string& contact_id);

  // Deletes all contacts.
  void Clear();

  // Merges |updated_contacts| into |contacts_|.
  void Merge(scoped_ptr<ScopedVector<Contact> > updated_contacts,
             DeletedContactPolicy policy);

 private:
  Map contacts_;

  // Deletes values in |contacts_|.
  STLValueDeleter<Map> contacts_deleter_;

  DISALLOW_COPY_AND_ASSIGN(ContactMap);
};

}  // namespace contacts

#endif  // CHROME_BROWSER_CHROMEOS_CONTACTS_CONTACT_MAP_H_
