// Copyright 2014 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 EXTENSIONS_BROWSER_ERROR_MAP_H_
#define EXTENSIONS_BROWSER_ERROR_MAP_H_

#include <stddef.h>

#include <map>
#include <memory>
#include <set>
#include <string>

#include "base/containers/circular_deque.h"
#include "base/macros.h"
#include "extensions/browser/extension_error.h"

namespace extensions {

using ErrorList = base::circular_deque<std::unique_ptr<ExtensionError>>;

// An ErrorMap is responsible for storing Extension-related errors, keyed by
// Extension ID.
class ErrorMap {
 public:
  ErrorMap();
  ~ErrorMap();

  struct Filter {
    Filter(const std::string& restrict_to_extension_id,
           int restrict_to_type,
           const std::set<int>& restrict_to_ids,
           bool restrict_to_incognito);
    Filter(const Filter& other);
    ~Filter();

    // Convenience methods to get a specific type of filter. Prefer these over
    // the constructor when possible.
    static Filter ErrorsForExtension(const std::string& extension_id);
    static Filter ErrorsForExtensionWithType(const std::string& extension_id,
                                             ExtensionError::Type type);
    static Filter ErrorsForExtensionWithIds(const std::string& extension_id,
                                            const std::set<int>& ids);
    static Filter ErrorsForExtensionWithTypeAndIds(
        const std::string& extension_id,
        ExtensionError::Type type,
        const std::set<int>& ids);
    static Filter IncognitoErrors();

    bool Matches(const ExtensionError* error) const;

    const std::string restrict_to_extension_id;
    const int restrict_to_type;
    const std::set<int> restrict_to_ids;
    const bool restrict_to_incognito;
  };

  // Return the list of all errors associated with the given extension.
  const ErrorList& GetErrorsForExtension(const std::string& extension_id) const;

  // Add the |error| to the ErrorMap.
  const ExtensionError* AddError(std::unique_ptr<ExtensionError> error);

  // Removes errors that match the given |filter| from the map. If non-null,
  // |affected_ids| will be populated with the set of extension ids that were
  // affected by this removal.
  void RemoveErrors(const Filter& filter, std::set<std::string>* affected_ids);

  // Remove all errors for all extensions, and clear the map.
  void RemoveAllErrors();

  size_t size() const { return map_.size(); }

 private:
  // An Entry is created for each Extension ID, and stores the errors related to
  // that Extension.
  class ExtensionEntry;

  // The mapping between Extension IDs and their corresponding Entries.
  std::map<std::string, std::unique_ptr<ExtensionEntry>> map_;

  DISALLOW_COPY_AND_ASSIGN(ErrorMap);
};

}  // namespace extensions

#endif  // EXTENSIONS_BROWSER_ERROR_MAP_H_
