package com.codahale.metrics.httpclient;

import org.apache.http.HttpRequest;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpRequestWrapper;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URIBuilder;

import java.net.URI;
import java.net.URISyntaxException;

import static com.codahale.metrics.MetricRegistry.name;

public class HttpClientMetricNameStrategies {

    public static final HttpClientMetricNameStrategy METHOD_ONLY =
        (name, request) -> name(HttpClient.class,
            name,
            methodNameString(request));

    public static final HttpClientMetricNameStrategy HOST_AND_METHOD =
        (name, request) -> name(HttpClient.class,
            name,
            requestURI(request).getHost(),
            methodNameString(request));

    public static final HttpClientMetricNameStrategy QUERYLESS_URL_AND_METHOD =
        (name, request) -> {
            try {
                final URIBuilder url = new URIBuilder(requestURI(request));
                return name(HttpClient.class,
                    name,
                    url.removeQuery().build().toString(),
                    methodNameString(request));
            } catch (URISyntaxException e) {
                throw new IllegalArgumentException(e);
            }
        };

    private static String methodNameString(HttpRequest request) {
        return request.getRequestLine().getMethod().toLowerCase() + "-requests";
    }

    private static URI requestURI(HttpRequest request) {
        if (request instanceof HttpRequestWrapper)
            return requestURI(((HttpRequestWrapper) request).getOriginal());

        return (request instanceof HttpUriRequest) ?
            ((HttpUriRequest) request).getURI() :
            URI.create(request.getRequestLine().getUri());
    }
}