// 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 char kWorkerThreadName[] = "FeedbackWorkerThread";

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)
    : worker_thread_(kWorkerThreadName), watcher_(loop_.task_runner()) {
  worker_thread_.Start();
  uploader_ = std::make_unique<FeedbackUploaderHttp>(
      base::FilePath(kFeedbackReportPath), worker_thread_.task_runner(), url);
}

Daemon::~Daemon() = default;

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;
}
