// Copyright 2015 The Chromium 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 "remoting/test/app_remoting_report_issue_request.h"

#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/logging.h"
#include "base/thread_task_runner_handle.h"
#include "net/http/http_response_headers.h"
#include "net/http/http_status_code.h"
#include "net/url_request/url_fetcher.h"
#include "remoting/base/url_request_context_getter.h"

namespace {
const char kRequestTestOrigin[] =
    "Origin: chrome-extension://ljacajndfccfgnfohlgkdphmbnpkjflk";
}

namespace remoting {
namespace test {

AppRemotingReportIssueRequest::AppRemotingReportIssueRequest() {
}

AppRemotingReportIssueRequest::~AppRemotingReportIssueRequest() {
}

bool AppRemotingReportIssueRequest::Start(
    const std::string& application_id,
    const std::string& host_id,
    const std::string& access_token,
    ServiceEnvironment service_environment,
    bool abandon_host,
    base::Closure done_callback) {
  DCHECK(request_complete_callback_.is_null()) << "Request pending";

  VLOG(2) << "AppRemotingReportIssueRequest::Start() called";

  std::string service_url(
      GetReportIssueUrl(application_id, host_id, service_environment));
  if (service_url.empty()) {
    LOG(ERROR) << "Unrecognized service type: " << service_environment;
    return false;
  }
  VLOG(1) << "Sending Report Issue service request to: " << service_url;

  request_complete_callback_ = done_callback;

  request_context_getter_ = new remoting::URLRequestContextGetter(
      base::ThreadTaskRunnerHandle::Get(),   // network_runner
      base::ThreadTaskRunnerHandle::Get());  // file_runner

  std::string upload_data = abandon_host ? "{ 'abandonHost': 'true' }" : "{}";

  request_ =
      net::URLFetcher::Create(GURL(service_url), net::URLFetcher::POST, this);
  request_->SetRequestContext(request_context_getter_.get());
  request_->AddExtraRequestHeader("Authorization: OAuth " + access_token);
  request_->AddExtraRequestHeader(kRequestTestOrigin);
  request_->SetUploadData("application/json; charset=UTF-8", upload_data);
  request_->Start();

  return true;
}

void AppRemotingReportIssueRequest::OnURLFetchComplete(
    const net::URLFetcher* source) {
  VLOG(2) << "URL Fetch Completed for: " << source->GetOriginalURL();

  int response_code = request_->GetResponseCode();
  if (response_code != net::HTTP_OK && response_code != net::HTTP_NO_CONTENT) {
    LOG(ERROR) << "ReportIssue request failed with error code: "
               << response_code;
  }

  base::ResetAndReturn(&request_complete_callback_).Run();
}

}  // namespace test
}  // namespace remoting
