// Copyright 2014 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 "components/cryptauth/cryptauth_api_call_flow.h"

#include "base/optional.h"
#include "base/strings/string_number_conversions.h"
#include "chromeos/components/proximity_auth/logging/logging.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "net/url_request/url_fetcher.h"

namespace cryptauth {

namespace {

NetworkRequestError GetErrorForHttpResponseCode(int response_code) {
  if (response_code == 400)
    return NetworkRequestError::kBadRequest;

  if (response_code == 403)
    return NetworkRequestError::kAuthenticationError;

  if (response_code == 404)
    return NetworkRequestError::kEndpointNotFound;

  if (response_code >= 500 && response_code < 600)
    return NetworkRequestError::kInternalServerError;

  return NetworkRequestError::kUnknown;
}

}  // namespace

CryptAuthApiCallFlow::CryptAuthApiCallFlow() {
}

CryptAuthApiCallFlow::~CryptAuthApiCallFlow() {
}

void CryptAuthApiCallFlow::Start(const GURL& request_url,
                                 net::URLRequestContextGetter* context,
                                 const std::string& access_token,
                                 const std::string& serialized_request,
                                 const ResultCallback& result_callback,
                                 const ErrorCallback& error_callback) {
  request_url_ = request_url;
  serialized_request_ = serialized_request;
  result_callback_ = result_callback;
  error_callback_ = error_callback;
  OAuth2ApiCallFlow::Start(context, access_token);
}

GURL CryptAuthApiCallFlow::CreateApiCallUrl() {
  return request_url_;
}

std::string CryptAuthApiCallFlow::CreateApiCallBody() {
  return serialized_request_;
}

std::string CryptAuthApiCallFlow::CreateApiCallBodyContentType() {
  return "application/x-protobuf";
}

net::URLFetcher::RequestType CryptAuthApiCallFlow::GetRequestTypeForBody(
    const std::string& body) {
  return net::URLFetcher::POST;
}

void CryptAuthApiCallFlow::ProcessApiCallSuccess(
    const net::URLFetcher* source) {
  std::string serialized_response;
  if (!source->GetResponseAsString(&serialized_response)) {
    error_callback_.Run(NetworkRequestError::kResponseMalformed);
    return;
  }
  result_callback_.Run(serialized_response);
}

void CryptAuthApiCallFlow::ProcessApiCallFailure(
    const net::URLFetcher* source) {
  base::Optional<NetworkRequestError> error;
  if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS) {
    error = GetErrorForHttpResponseCode(source->GetResponseCode());
  } else {
    error = NetworkRequestError::kOffline;
  }

  std::string response;
  source->GetResponseAsString(&response);
  PA_LOG(INFO) << "API call failed:\n" << response;
  error_callback_.Run(*error);
}

net::PartialNetworkTrafficAnnotationTag
CryptAuthApiCallFlow::GetNetworkTrafficAnnotationTag() {
  DCHECK(partial_network_annotation_ != nullptr);
  return *partial_network_annotation_.get();
}

}  // namespace cryptauth
