// Copyright 2014 The Chromium OS 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 BUFFET_PRIVET_CLOUD_DELEGATE_H_
#define BUFFET_PRIVET_CLOUD_DELEGATE_H_

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

#include <base/callback.h>
#include <base/memory/ref_counted.h>
#include <base/observer_list.h>

#include "buffet/privet/privet_types.h"
#include "buffet/privet/security_delegate.h"

namespace base {
class DictionaryValue;
}  // namespace base

namespace buffet {
class CommandManager;
class DeviceRegistrationInfo;
class StateManager;
}

namespace privetd {

// Interface to provide GCD functionality for PrivetHandler.
// TODO(vitalybuka): Rename to BuffetDelegate.
class CloudDelegate {
 public:
  CloudDelegate();
  virtual ~CloudDelegate();

  using SuccessCallback = base::Callback<void(const base::DictionaryValue&)>;
  using ErrorCallback = base::Callback<void(chromeos::Error*)>;

  class Observer {
   public:
    virtual ~Observer() = default;

    virtual void OnDeviceInfoChanged() {}
    virtual void OnCommandDefsChanged() {}
    virtual void OnStateChanged() {}
  };

  // Returns the model ID of the device.
  virtual bool GetModelId(std::string* id, chromeos::ErrorPtr* error) const = 0;

  // Returns the name of device.
  virtual bool GetName(std::string* name, chromeos::ErrorPtr* error) const = 0;

  // Returns the description of the device.
  virtual std::string GetDescription() const = 0;

  // Returns the location of the device.
  virtual std::string GetLocation() const = 0;

  // Update basic device information.
  virtual void UpdateDeviceInfo(const std::string& name,
                                const std::string& description,
                                const std::string& location,
                                const base::Closure& success_callback,
                                const ErrorCallback& error_callback) = 0;

  // Returns the name of the maker.
  virtual std::string GetOemName() const = 0;

  // Returns the model name of the device.
  virtual std::string GetModelName() const = 0;

  // Returns the list of services supported by device.
  // E.g. printer, scanner etc. Should match services published on mDNS.
  virtual std::set<std::string> GetServices() const = 0;

  // Returns max scope available for anonymous user.
  virtual AuthScope GetAnonymousMaxScope() const = 0;

  // Returns status of the GCD connection.
  virtual const ConnectionState& GetConnectionState() const = 0;

  // Returns status of the last setup.
  virtual const SetupState& GetSetupState() const = 0;

  // Starts GCD setup.
  virtual bool Setup(const std::string& ticket_id,
                     const std::string& user,
                     chromeos::ErrorPtr* error) = 0;

  // Returns cloud id if the registered device or empty string if unregistered.
  virtual std::string GetCloudId() const = 0;

  // Returns dictionary with device state.
  virtual const base::DictionaryValue& GetState() const = 0;

  // Returns dictionary with commands definitions.
  virtual const base::DictionaryValue& GetCommandDef() const = 0;

  // Adds command created from the given JSON representation.
  virtual void AddCommand(const base::DictionaryValue& command,
                          const UserInfo& user_info,
                          const SuccessCallback& success_callback,
                          const ErrorCallback& error_callback) = 0;

  // Returns command with the given ID.
  virtual void GetCommand(const std::string& id,
                          const UserInfo& user_info,
                          const SuccessCallback& success_callback,
                          const ErrorCallback& error_callback) = 0;

  // Cancels command with the given ID.
  virtual void CancelCommand(const std::string& id,
                             const UserInfo& user_info,
                             const SuccessCallback& success_callback,
                             const ErrorCallback& error_callback) = 0;

  // Lists commands.
  virtual void ListCommands(const UserInfo& user_info,
                            const SuccessCallback& success_callback,
                            const ErrorCallback& error_callback) = 0;

  void AddObserver(Observer* observer) { observer_list_.AddObserver(observer); }
  void RemoveObserver(Observer* observer) {
    observer_list_.RemoveObserver(observer);
  }

  void NotifyOnDeviceInfoChanged();
  void NotifyOnCommandDefsChanged();
  void NotifyOnStateChanged();

  // Create default instance.
  static std::unique_ptr<CloudDelegate> CreateDefault(
      bool is_gcd_setup_enabled,
      buffet::DeviceRegistrationInfo* device,
      buffet::CommandManager* command_manager,
      buffet::StateManager* state_manager);

 private:
  ObserverList<Observer> observer_list_;
};

}  // namespace privetd

#endif  // BUFFET_PRIVET_CLOUD_DELEGATE_H_
