package com.orhanobut.wasp.utils;

import android.text.TextUtils;

import com.orhanobut.wasp.Logger;
import com.squareup.okhttp.Headers;
import com.squareup.okhttp.Interceptor;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;

import java.io.IOException;

import okio.Buffer;

/**
 * An {@link com.squareup.okhttp.Interceptor} implementation which logs all info about
 * outgoing request and related response including complete header set, request
 * and response bodies and network time
 */
public class OkHttpLogInterceptor implements Interceptor {

  private static final double MILLI_AS_NANO = 1e6d;

  @Override
  public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();
    Logger.d("---> REQUEST " + request.method() + " " + request.urlString());
    logHeaders(request.headers());
    //copy original request for logging request body
    Request copy = request.newBuilder().build();
    RequestBody requestBody = copy.body();
    if (requestBody == null) {
      Logger.d("Body - no body");
    } else {
      Buffer buffer = new Buffer();
      requestBody.writeTo(buffer);
      Logger.d("Body - " + buffer.readString(requestBody.contentType().charset()));
    }
    Logger.d("---> END");

    long t1 = System.nanoTime();
    Response response = chain.proceed(request);
    long t2 = System.nanoTime();

    Logger.d("<--- RESPONSE " + response.code() + " " + response.request().urlString());
    logHeaders(response.headers());
    String responseBody = response.body().string();
    Logger.d(TextUtils.isEmpty(responseBody) ? "Body - no body" : "Body - " + responseBody);
    Logger.d("<--- END " + "(Size: " + response.body().contentLength() + " bytes - "
        + "Network time: " + (t2 - t1) / MILLI_AS_NANO + " ms)");

    return response;
  }

  private static void logHeaders(Headers headers) {
    for (String headerName : headers.names()) {
      for (String headerValue : headers.values(headerName)) {
        Logger.d("Header - [" + headerName + ": " + headerValue + "]");
      }
    }
  }
}