/*******************************************************************************
 * Copyright (c) 2018 Ericsson
 *
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License v1.0 which
 * accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/

package org.eclipse.tracecompass.incubator.internal.opentracing.ui.project.wizards;

/**
 * Jaeger REST utility class
 *
 * @author Simon Delisle
 */
public class JaegerRestUtils {

//    private static final String SERVICES_ENDPOINT = "services"; //$NON-NLS-1$
//    private static final String TRACES_ENDPOINT = "traces"; //$NON-NLS-1$
//
//    private static final String SERVICES_DATA_KEY = "data"; //$NON-NLS-1$
//
//    /**
//     * Parameters key for traces request
//     */
//    private static final String SEARCH_END_TIME = "end"; //$NON-NLS-1$
//    private static final String NB_TRACES_LIMIT = "limit"; //$NON-NLS-1$
//    private static final String LOOKBACK = "lookback"; //$NON-NLS-1$
//    private static final String MAX_DURATION = "maxDuration"; //$NON-NLS-1$
//    private static final String MIN_DURATION = "minDuration"; //$NON-NLS-1$
//    private static final String SERVICE_NAME = "service"; //$NON-NLS-1$
//    private static final String SEARCH_START_TIME = "start"; //$NON-NLS-1$
//    private static final String TAGS = "tags"; //$NON-NLS-1$

    private JaegerRestUtils() {
    }

    /**
     * Fetch the available services from Jaeger, used to create the URL to fetch
     * traces
     *
     * @param baseUrl
     *            Base URL of Jaeger API
     * @return Array of service names
     */
    public static String[] fetchServices(String baseUrl) {
        return new String[0];
//        URI uri = UriBuilder.fromUri(baseUrl).path(SERVICES_ENDPOINT).build();
//        String response = jaegerGet(uri.toString());
//        Gson gson = new Gson();
//        JsonObject jsonResponse = gson.fromJson(response, JsonObject.class);
//        JsonArray servicesArray = jsonResponse.get(SERVICES_DATA_KEY).getAsJsonArray();
//        String[] services = new String[servicesArray.size()];
//        for (int i = 0; i < servicesArray.size(); i++) {
//            services[i] = servicesArray.get(i).getAsString();
//        }
//        return services;
    }

    /**
     * Build the correct URL with the given parameters that will be use to fetch
     * traces
     *
     * @param baseUrl
     *            Base URL of Jaeger API
     * @param service
     *            Service name
     * @param startTime
     *            Search start time
     * @param endTime
     *            Search end time
     * @param limit
     *            Limit on the number of traces returned
     * @param lookback
     *            Amount of time to go look back for traces
     * @param maxDuration
     *            Trace maximum duration
     * @param minDuration
     *            Trace minimum duration
     * @param tags
     *            Span tags filter
     * @return The built URL
     */
    public static String buildTracesUrl(String baseUrl, String endTime, String limit, String lookback, String maxDuration, String minDuration, String service, String startTime, String tags) {
        return "";
//        UriBuilder uriBuilder = UriBuilder.fromUri(baseUrl).path(TRACES_ENDPOINT)
//                .queryParam(SEARCH_END_TIME, endTime)
//                .queryParam(NB_TRACES_LIMIT, limit)
//                .queryParam(LOOKBACK, lookback)
//                .queryParam(SERVICE_NAME, service)
//                .queryParam(SEARCH_START_TIME, startTime);
//        if (!maxDuration.isEmpty()) {
//            uriBuilder.queryParam(MAX_DURATION, maxDuration);
//        }
//        if (!minDuration.isEmpty()) {
//            uriBuilder.queryParam(MIN_DURATION, minDuration);
//        }
//        if (!tags.isEmpty()) {
//            try {
//                uriBuilder.queryParam(TAGS, URLEncoder.encode(tags, StandardCharsets.UTF_8.name()));
//            } catch (UnsupportedEncodingException e) {
//                // We don't add the tags if the encoding fails
//            }
//        }
//
//        return uriBuilder.build().toString();
    }

    /**
     * Fetch the traces from Jaeger
     *
     * @param url
     *            The complete URL (built from buildTracesUrl)
     * @return A JSon string that contains all the traces or null if there is a
     *         problem with the connection
     */
    public static String fetchJaegerTraces(String url) {
        return jaegerGet(url);
    }

    /**
     * @param url
     */
    private static String jaegerGet(String url) {
        return null;
//        Client client = ClientBuilder.newClient();
//        WebTarget resource = client.target(url);
//        Builder request = resource.request();
//        request.accept(MediaType.APPLICATION_JSON);
//        try {
//            return request.get(String.class);
//        } catch (Exception e) {
//            return null;
//        }
    }

    /**
     * Verify the connection with the API URL
     *
     * @param url
     *            URL of Jaeger API
     * @return True if the connection can be establish
     */
    public static boolean jaegerCheckConnection(String url) {
        return false;
//        Client client = ClientBuilder.newClient();
//        WebTarget resource = client.target(url);
//        Builder request = resource.request();
//        try {
//            int status = request.get().getStatus();
//            return Response.Status.fromStatusCode(status) == Response.Status.OK;
//        } catch (Exception e) {
//            return false;
//        }
    }
}
