// 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 COMPONENTS_COPRESENCE_PUBLIC_COPRESENCE_MANAGER_H_
#define COMPONENTS_COPRESENCE_PUBLIC_COPRESENCE_MANAGER_H_

#include "base/memory/scoped_ptr.h"
#include "components/copresence/public/copresence_delegate.h"

namespace copresence {

class ReportRequest;

// The CopresenceManager class is the central interface for Copresence
// functionality. This class handles all the initialization and delegation
// of copresence tasks. Any user of copresence only needs to interact
// with this class.
class CopresenceManager {
 public:
  CopresenceManager() {}
  virtual ~CopresenceManager() {}

  // This method will execute a report request. Each report request can have
  // multiple (un)publishes, (un)subscribes. This will ensure that once the
  // manager is initialized, it sends all request to the server and handles
  // the response. If an error is encountered, the status callback is used
  // to relay it to the requester.
  virtual void ExecuteReportRequest(ReportRequest request,
                                    const std::string& app_id,
                                    const StatusCallback& callback) = 0;

  // Factory method for CopresenceManagers. The delegate is owned
  // by the caller, and must outlive the manager.
  static scoped_ptr<CopresenceManager> Create(CopresenceDelegate* delegate);

 private:

  DISALLOW_COPY_AND_ASSIGN(CopresenceManager);
};

}  // namespace copresence

#endif  // COMPONENTS_COPRESENCE_PUBLIC_COPRESENCE_MANAGER_H_