package net.onrc.onos.apps.bgproute;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.commons.httpclient.ConnectTimeoutException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class RestClient {
    protected final static Logger log = LoggerFactory.getLogger(RestClient.class);

    public static String get(String str) {
        StringBuilder response = new StringBuilder();

        try {

            URL url = new URL(str);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(2 * 1000); //2 seconds
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept", "application/json");

            if (conn.getResponseCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + conn.getResponseCode());
            }

            if (!conn.getContentType().equals("application/json")) {
                log.warn("The content received from {} is not json", str);
            }

            BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
            String line;
            while ((line = br.readLine()) != null) {
                response.append(line);
            }

            br.close();
            conn.disconnect();

        } catch (MalformedURLException e) {
            log.error("Malformed URL for GET request", e);
        } catch (ConnectTimeoutException e) {
            log.warn("Couldn't connect remote REST server");
        } catch (IOException e) {
            log.warn("Couldn't connect remote REST server");
        }

        return response.toString();
    }

    public static void post(String str) {

        try {
            URL url = new URL(str);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");

            if (conn.getResponseCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + conn.getResponseCode());
            }

            conn.disconnect();

        } catch (MalformedURLException e) {
            log.error("Malformed URL for GET request", e);
        } catch (IOException e) {
            log.warn("Couldn't connect remote REST server");
        }
    }


    public static void delete(String str) {

        try {
            URL url = new URL(str);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("DELETE");
            conn.setRequestProperty("Accept", "application/json");


            if (conn.getResponseCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + conn.getResponseCode());
            }

            conn.disconnect();

        } catch (MalformedURLException e) {
            log.error("Malformed URL for GET request", e);
        } catch (IOException e) {
            log.warn("Couldn't connect remote REST server");
        }
    }
}
