// 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.

#include "privetd/wifi_delegate.h"

#include <base/bind.h>
#include <base/logging.h>
#include <base/memory/weak_ptr.h>
#include <base/message_loop/message_loop.h>

namespace privetd {

namespace {

class WifiDelegateImpl : public WifiDelegate {
 public:
  WifiDelegateImpl() {}
  ~WifiDelegateImpl() override {}

  // WifiDelegate methods
  bool IsRequired() const override { return false; }

  ConnectionState GetState() const override { return state_; }

  SetupState GetSetupState() const override { return setup_state_; }

  bool Setup(const std::string& ssid, const std::string& password) override {
    if (setup_state_.status == SetupState::kInProgress)
      return false;
    VLOG(1) << "WiFi Setup started. ssid: " << ssid << ", pass:" << password;
    setup_state_ = SetupState(SetupState::kInProgress);
    base::MessageLoop::current()->PostDelayedTask(
        FROM_HERE, base::Bind(&WifiDelegateImpl::OnSetupDone,
                              weak_factory_.GetWeakPtr(), ssid),
        base::TimeDelta::FromSeconds(5));
    return true;
  }

  std::string GetSsid() const override { return ssid_; }

  std::string GetHostedSsid() const override { return std::string(); }

  std::vector<WifiType> GetTypes() const override {
    return {WifiType::kWifi24};
  }

 private:
  void OnSetupDone(const std::string& ssid) {
    VLOG(1) << "WiFi Setup done";
    setup_state_ = SetupState(SetupState::kSuccess);
    state_ = ConnectionState(ConnectionState::kOnline);
    ssid_ = ssid;
  }

  // Primary state of WiFi.
  ConnectionState state_{ConnectionState::kUnconfigured};

  // State of the current or last setup.
  SetupState setup_state_{SetupState::kNone};

  // The last successfully used WiFi ssid.
  std::string ssid_;

  base::WeakPtrFactory<WifiDelegateImpl> weak_factory_{this};
};

}  // namespace

WifiDelegate::WifiDelegate() {
}

WifiDelegate::~WifiDelegate() {
}

// static
std::unique_ptr<WifiDelegate> WifiDelegate::CreateDefault() {
  return std::unique_ptr<WifiDelegate>(new WifiDelegateImpl);
}

}  // namespace privetd
