package com.https.app.SSL;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.toolbox.HttpStack;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Created by moltak on 3/17/14.
 */
public class SslHttpStack implements HttpStack {
    private HttpClient httpClient;

    public SslHttpStack(HttpClient httpClient) {
        this.httpClient = httpClient;
    }

    @Override
    public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
            throws IOException, AuthFailureError {
        HttpUriRequest uriRequest = createHttpRequest(request, additionalHeaders);
        addHeaders(uriRequest, additionalHeaders);
        addHeaders(uriRequest, request.getHeaders());
        HttpResponse response = httpClient.execute(uriRequest);
        return response;
    }

    private HttpUriRequest createHttpRequest(Request<?> request, Map<String, String> additionalHeaders)
            throws AuthFailureError, UnsupportedEncodingException {
        switch (request.getMethod()) {
            case Request.Method.GET:
                return new HttpGet(request.getUrl());
            case Request.Method.POST:
                HttpPost post = new HttpPost(request.getUrl());
                post.setEntity(new UrlEncodedFormEntity(getParams(request), HTTP.UTF_8));
                return post;
            default:
                throw new IllegalStateException("Unknown request method.");
        }
    }

    private List<NameValuePair> getParams(Request<?> request) throws AuthFailureError {
        ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
        if(request != null && request instanceof PostRequest) {
            Map<String, String> map = ((PostRequest) request).getParams();
            Iterator iterator = map.keySet().iterator();
            while(iterator.hasNext()) {
                String key = (String)iterator.next();
                params.add(new BasicNameValuePair(key, map.get(key)));
            }
        }

        return params;
    }

    private void addHeaders(HttpUriRequest uriRequest, Map<String, String> headers) {
        Iterator iterator = headers.keySet().iterator();
        while(iterator.hasNext()) {
            String key = (String)iterator.next();
            uriRequest.setHeader(key, headers.get(key));
        }
    }
}