// 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 "feedback/feedback_daemon.h"

#include <unistd.h>

#include <base/at_exit.h>
#include <base/bind.h>
#include <base/command_line.h>
#include <base/logging.h>
#include <base/run_loop.h>
#include <base/strings/string_util.h>
#include <brillo/syslog_logging.h>
#include <dbus/bus.h>

#include "components/feedback/feedback_report.h"
#include "feedback/feedback_uploader_http.h"

namespace {

// string, set to "test" to use the sandbox server, otherwise a url
// to send the report to.
static const char kSwitchCustomServer[] = "url";

static const int kMaxPoolThreads = 1;
static const char kPoolName[] = "FeedbackWorkerPool";

static const char kFeedbackReportPath[] = "/run/";

static const char kFeedbackTestUrl[] =
    "http://sandbox.google.com/tools/feedback/chrome/__submit";
static const char kFeedbackPostUrl[] =
    "https://www.google.com/tools/feedback/chrome/__submit";

}  // namespace

namespace feedback {

Daemon::Daemon(const std::string& url)
    : loop_(base::MessageLoop::TYPE_IO),
      pool_(new base::SequencedWorkerPool(kMaxPoolThreads, kPoolName)),
      uploader_(new FeedbackUploaderHttp(base::FilePath(kFeedbackReportPath),
                                         pool_.get(), url)) {}

Daemon::~Daemon() {
  pool_->Shutdown();
}

void Daemon::Run() {
  base::RunLoop loop;
  dbus::Bus::Options options;
  options.bus_type = dbus::Bus::SYSTEM;

  scoped_refptr<dbus::Bus> bus = new dbus::Bus(options);
  scoped_refptr<DBusFeedbackServiceImpl> impl =
      new DBusFeedbackServiceImpl(uploader_.get());

  // Load all reports currently on disk and queue them for sending.
  FeedbackReport::LoadReportsAndQueue(
      uploader_->GetFeedbackReportsPath(),
      base::Bind(&FeedbackService::QueueExistingReport, impl.get()));

  CHECK(impl->Start(bus.get())) << "Failed to start feedback service";

  loop.Run();
}

}  // namespace feedback

int main(int argc, char** argv) {
  base::CommandLine::Init(argc, argv);
  base::CommandLine *args = base::CommandLine::ForCurrentProcess();

  // Some libchrome calls need this.
  base::AtExitManager at_exit_manager;

  brillo::InitLog(brillo::kLogToSyslog | brillo::kLogToStderr);

  std::string url = args->GetSwitchValueASCII(kSwitchCustomServer);
  if (url.empty()) {
    url = kFeedbackPostUrl;
  } else if (!url.compare("test")) {
    url = kFeedbackTestUrl;
    LOG(INFO) << "Using test feedback server";
  } else {
    LOG(INFO) << "Using feedback server at: " << url;
  }

  feedback::Daemon daemon(url);
  daemon.Run();

  return 0;
}
