// Copyright 2013 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 COMPONENTS_POLICY_CORE_COMMON_SCHEMA_MAP_H_
#define COMPONENTS_POLICY_CORE_COMMON_SCHEMA_MAP_H_

#include <map>
#include <string>

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "components/policy/core/common/policy_namespace.h"
#include "components/policy/core/common/schema.h"
#include "components/policy/policy_export.h"

namespace policy {

class PolicyBundle;

// Maps component id (e.g. extension id) to schema.
typedef std::map<std::string, Schema> ComponentMap;
typedef std::map<PolicyDomain, ComponentMap> DomainMap;

// Contains a mapping of policy namespaces (domain + component ID) to its
// corresponding Schema.
// This class is thread-safe.
class POLICY_EXPORT SchemaMap : public base::RefCountedThreadSafe<SchemaMap> {
 public:
  SchemaMap();
  // Takes ownership of |map| (its contents will be swapped).
  // TODO(emaxx): Change to use move semantics.
  explicit SchemaMap(DomainMap& map);

  const DomainMap& GetDomains() const;

  const ComponentMap* GetComponents(PolicyDomain domain) const;

  const Schema* GetSchema(const PolicyNamespace& ns) const;

  // Removes all the policies in |bundle| that don't match the known schemas.
  // Unknown components are also dropped.
  void FilterBundle(PolicyBundle* bundle) const;

  // Returns true if this map contains at least one component of a domain other
  // than POLICY_DOMAIN_CHROME.
  bool HasComponents() const;

  void GetChanges(const scoped_refptr<SchemaMap>& older,
                  PolicyNamespaceList* removed,
                  PolicyNamespaceList* added) const;

 private:
  friend class base::RefCountedThreadSafe<SchemaMap>;

  void GetNamespacesNotInOther(const SchemaMap* other,
                               PolicyNamespaceList* list) const;

  ~SchemaMap();

  DomainMap map_;

  DISALLOW_COPY_AND_ASSIGN(SchemaMap);
};

}  // namespace policy

#endif  // COMPONENTS_POLICY_CORE_COMMON_SCHEMA_MAP_H_
