package makulib;

import android.os.AsyncTask;
import android.text.TextUtils;

import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.CookieManager;
import java.net.HttpCookie;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by nmoya on 7/28/15.
 */
public class HTTPPost extends AsyncTask<String, Void, String> {

    private NetworkCallback listener;
    private HashMap<String, Object> data;
    private CookieManager cookies;
    static final String COOKIES_HEADER = "Set-Cookie";

    public HTTPPost(NetworkCallback listener, HashMap<String, Object> data, CookieManager cookies)
    {
        this.listener = listener;
        this.data = data;
        this.cookies = cookies;
    }
    @Override
    protected String doInBackground(String... _url) {
//        Log.i("URL", _url[0]);
//        Log.i("DATA", data.toString());
        String url = null;
        String charset = "UTF-8";
        String content = "";
        int letter;
        try {
            url = _url[0];
            URLConnection connection = new URL(url).openConnection();
            connection.setDoOutput(true); // Triggers POST.
            connection.setRequestProperty("Accept-Charset", charset);
            connection.setRequestProperty("Content-Type", "application/json;charset=" + charset);
            connection.setRequestProperty("Cookie", TextUtils.join(",", this.cookies.getCookieStore().getCookies()));

//            Log.i("Cookies", TextUtils.join(",", this.cookies.getCookieStore().getCookies()));

            JSONObject json = new JSONObject(this.data);
            OutputStream output = connection.getOutputStream();
            output.write(json.toString().getBytes());
            InputStream response = connection.getInputStream();
            while ((letter = response.read()) != -1) {
                content += (char) letter;
            }
            response.close();

            Map<String, List<String>> headerFields = connection.getHeaderFields();
            List<String> cookiesHeader = headerFields.get(COOKIES_HEADER);
            if(cookiesHeader != null)
            {
                for (String cookie : cookiesHeader)
                {
                    this.cookies.getCookieStore().add(null, HttpCookie.parse(cookie).get(0));
                }
            }
        } catch (IOException ioe){
            ioe.printStackTrace();
        }
        return content;
    }

    @Override
    protected void onPostExecute(String response) {
//        Log.i("Response", response);
        this.listener.onPostResponseToJava(response, this.cookies);
    }
}
