// Copyright 2016 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 MOJO_SERVICES_CATALOG_FACTORY_H_
#define MOJO_SERVICES_CATALOG_FACTORY_H_

#include <map>
#include <string>

#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/services/catalog/public/interfaces/catalog.mojom.h"
#include "mojo/services/catalog/public/interfaces/resolver.mojom.h"
#include "mojo/shell/public/cpp/shell_client.h"
#include "mojo/shell/public/interfaces/shell_client.mojom.h"
#include "mojo/shell/public/interfaces/shell_resolver.mojom.h"

namespace base {
class TaskRunner;
}

namespace mojo{
class ShellConnection;
}

namespace catalog {

class Catalog;
class Store;

// Creates and owns an instance of the catalog. Exposes a ShellClientPtr that
// can be passed to the Shell, potentially in a different process.
class Factory
    : public mojo::ShellClient,
      public mojo::InterfaceFactory<mojom::Catalog>,
      public mojo::InterfaceFactory<mojom::Resolver>,
      public mojo::InterfaceFactory<mojo::shell::mojom::ShellResolver> {
 public:
  Factory(base::TaskRunner* file_task_runner, scoped_ptr<Store> store);
  ~Factory() override;

  mojo::shell::mojom::ShellClientPtr TakeShellClient();

 private:
  // mojo::ShellClient:
  bool AcceptConnection(mojo::Connection* connection) override;

  // mojo::InterfaceFactory<mojom::Resolver>:
  void Create(mojo::Connection* connection,
              mojom::ResolverRequest request) override;

  // mojo::InterfaceFactory<mojo::shell::mojom::ShellResolver>:
  void Create(mojo::Connection* connection,
              mojo::shell::mojom::ShellResolverRequest request) override;

  // mojo::InterfaceFactory<mojom::Catalog>:
  void Create(mojo::Connection* connection,
              mojom::CatalogRequest request) override;

  Catalog* GetCatalogForUserId(const std::string& user_id);

  base::TaskRunner* file_task_runner_;
  scoped_ptr<Store> store_;

  mojo::shell::mojom::ShellClientPtr shell_client_;
  scoped_ptr<mojo::ShellConnection> shell_connection_;

  std::map<std::string, scoped_ptr<Catalog>> catalogs_;

  base::WeakPtrFactory<Factory> weak_factory_;

  DISALLOW_COPY_AND_ASSIGN(Factory);
};

}  // namespace catalog

#endif  // MOJO_SERVICES_CATALOG_FACTORY_H_