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

#include "src/privet/device_delegate.h"

#include <base/guid.h>
#include <weave/provider/task_runner.h>

#include "src/privet/constants.h"

namespace weave {
namespace privet {

namespace {

class DeviceDelegateImpl : public DeviceDelegate {
 public:
  DeviceDelegateImpl(provider::TaskRunner* task_runner,
                     uint16_t http_port,
                     uint16_t https_port,
                     base::TimeDelta http_request_timeout)
      : task_runner_{task_runner}, http_request_timeout_{http_request_timeout},
        http_port_{http_port}, https_port_{https_port} {}
  ~DeviceDelegateImpl() override = default;

  std::pair<uint16_t, uint16_t> GetHttpEnpoint() const override {
    return std::make_pair(http_port_, http_port_);
  }
  std::pair<uint16_t, uint16_t> GetHttpsEnpoint() const override {
    return std::make_pair(https_port_, https_port_);
  }
  base::TimeDelta GetUptime() const override {
    return base::Time::Now() - start_time_;
  }

  base::TimeDelta GetHttpRequestTimeout() const override {
    return http_request_timeout_;
  }

  void PostDelayedTask(const tracked_objects::Location& from_here,
                       const base::Closure& task,
                       base::TimeDelta delay) override {
    task_runner_->PostDelayedTask(from_here, task, delay);
  }

 private:
  provider::TaskRunner* task_runner_;
  base::TimeDelta http_request_timeout_;
  uint16_t http_port_{0};
  uint16_t https_port_{0};
  base::Time start_time_{base::Time::Now()};
};

}  // namespace

DeviceDelegate::DeviceDelegate() {}

DeviceDelegate::~DeviceDelegate() {}

// static
std::unique_ptr<DeviceDelegate> DeviceDelegate::CreateDefault(
    provider::TaskRunner* task_runner,
    uint16_t http_port,
    uint16_t https_port,
    base::TimeDelta http_request_timeout) {
  return std::unique_ptr<DeviceDelegate>(
      new DeviceDelegateImpl(task_runner, http_port, https_port,
                             http_request_timeout));
}

}  // namespace privet
}  // namespace weave
