// Copyright 2015 The Weave 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 LIBWEAVE_SRC_PRIVET_WIFI_DELEGATE_H_
#define LIBWEAVE_SRC_PRIVET_WIFI_DELEGATE_H_

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

#include "src/privet/privet_types.h"

namespace weave {
namespace privet {

// Interface to provide WiFi functionality for PrivetHandler.
class WifiDelegate {
 public:
  WifiDelegate() = default;
  virtual ~WifiDelegate() = default;

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

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

  // Starts WiFi setup. Device should try to connect to provided SSID and
  // password and store them on success. Result of setup should be available
  // using GetSetupState().
  // Final setup state can be retrieved with GetSetupState().
  virtual bool ConfigureCredentials(const std::string& ssid,
                                    const std::string& password,
                                    ErrorPtr* error) = 0;

  // Returns SSID of the currently configured WiFi network. Empty string, if
  // WiFi has not been configured yet.
  virtual std::string GetCurrentlyConnectedSsid() const = 0;

  // Returns SSID of the WiFi network hosted by this device. Empty if device is
  // not in setup or P2P modes.
  virtual std::string GetHostedSsid() const = 0;

  // Returns list of supported WiFi types. Currently it's just frequencies.
  virtual std::set<WifiType> GetTypes() const = 0;
};

}  // namespace privet
}  // namespace weave

#endif  // LIBWEAVE_SRC_PRIVET_WIFI_DELEGATE_H_
