package no.dnb.openbanking.gettingstarted;

import com.amazonaws.AmazonServiceException;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.DefaultRequest;
import com.amazonaws.Request;
import com.amazonaws.Response;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.http.AmazonHttpClient;
import com.amazonaws.http.AmazonHttpClient.RequestExecutionBuilder;
import com.amazonaws.http.ExecutionContext;
import com.amazonaws.http.HttpMethodName;
import org.json.JSONArray;
import org.json.JSONObject;

import java.io.ByteArrayInputStream;
import java.net.URI;
import java.nio.charset.Charset;

public class GettingStarted {
  private static final String AWS_SERVICE = "execute-api";

  // Open Banking constants
  private static final String OPENBANKING_ENDPOINT = "https://developer-api-testmode.dnb.no";
  private static final String API_KEY_HEADER = "x-api-key";

  private static Request createRequest(final HttpMethodName httpMethodName, final String path) {
    final Request request = new DefaultRequest(AWS_SERVICE);
    request.setHttpMethod(httpMethodName);
    request.setEndpoint(URI.create(OPENBANKING_ENDPOINT));
    request.setResourcePath(path);
    request.addHeader("Accept", "application/json");
    request.addHeader("Content-type", "application/json");
    request.addHeader(API_KEY_HEADER, Config.get("API_KEY"));
    return request;
  }

  private static RequestExecutionBuilder buildRequest(final Request request) {
    try {
      return new AmazonHttpClient(new ClientConfiguration()).requestExecutionBuilder()
          .executionContext(new ExecutionContext(true)).request(request)
          .errorResponseHandler(new ErrorResponseHandler(false));
    } catch (AmazonServiceException exception) {
      System.out.println("Unexpected status code in response: " + exception.getStatusCode());
      System.out.println("Content: " + exception.getRawResponseContent());
      throw new RuntimeException("Failed request. Aborting.");
    }
  }

  public static Response<JSONArray> getTestCustomers() {
    final Request currenciesRequest = createRequest(HttpMethodName.GET, "/test-customers/v0");

    return buildRequest(currenciesRequest).execute(new ResponseHandlerJSONArray(false));
  }

  public static Response<JSONArray> getCurrencyConversions(String quoteCurrency) {
    final Request currenciesRequest = createRequest(HttpMethodName.GET, "/currencies/v1/convert/" + quoteCurrency);

    return buildRequest(currenciesRequest).execute(new ResponseHandlerJSONArray(false));
  }

  public static Response<JSONObject> getCurrencyConversion(String quoteCurrency, String baseCurrency) {
    final Request currenciesRequest = createRequest(HttpMethodName.GET,
        "/currencies/v1/" + baseCurrency + "/convert/" + quoteCurrency);

    return buildRequest(currenciesRequest).execute(new ResponseHandlerJSONObject(false));
  }
}