package com.oklab.gitjourney.asynctasks;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.util.Log;

import com.oklab.gitjourney.R;
import com.oklab.gitjourney.data.HTTPConnectionResult;
import com.oklab.gitjourney.data.UserSessionData;
import com.oklab.gitjourney.parsers.Parser;
import com.oklab.gitjourney.services.FetchHTTPConnectionService;
import com.oklab.gitjourney.utils.Utils;

import org.json.JSONException;
import org.json.JSONObject;

/**
 * Created by olgakuklina on 2017-03-21.
 */

public class UserProfileAsyncTask<T> extends AsyncTask<String, Void, T> {

    private static final String TAG = UserProfileAsyncTask.class.getSimpleName();
    private final Context context;
    private final UserProfileAsyncTask.OnProfilesLoadedListener<T> listener;
    private final Parser<T> parser;
    private UserSessionData currentSessionData;

    public UserProfileAsyncTask(Context context, UserProfileAsyncTask.OnProfilesLoadedListener<T> listener, Parser<T> parser) {
        this.context = context;
        this.listener = listener;
        this.parser = parser;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        SharedPreferences prefs = context.getSharedPreferences(Utils.SHARED_PREF_NAME, 0);
        String sessionDataStr = prefs.getString("userSessionData", null);
        currentSessionData = UserSessionData.createUserSessionDataFromString(sessionDataStr);
    }

    @Override
    protected T doInBackground(String... args) {
        String uri;
        if (args.length > 0) {
            String login = args[0];
            uri = context.getString(R.string.url_users, login);
        } else {
            uri = context.getString(R.string.url_user);
        }
        FetchHTTPConnectionService connectionFetcher = new FetchHTTPConnectionService(uri, currentSessionData);
        HTTPConnectionResult result = connectionFetcher.establishConnection();
        Log.v(TAG, "responseCode = " + result.getResponceCode());
        Log.v(TAG, "response = " + result.getResult());

        try {
            JSONObject jsonObject = new JSONObject(result.getResult());
            return parser.parse(jsonObject);

        } catch (JSONException e) {
            Log.e(TAG, "", e);
        }
        return null;
    }

    @Override
    protected void onPostExecute(T entry) {
        super.onPostExecute(entry);
        listener.OnProfilesLoaded(entry);
    }

    public interface OnProfilesLoadedListener<T> {
        void OnProfilesLoaded(T dataEntry);
    }
}