package io.github.mthli.Tweetin.Task.OAuth;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.widget.Toast;
import io.github.mthli.Tweetin.Activity.MainActivity;
import io.github.mthli.Tweetin.R;
import io.github.mthli.Tweetin.Twitter.TwitterUnit;
import twitter4j.Twitter;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;

public class GetAccessTokenTask extends AsyncTask<Void, Void, Boolean> {
    private MainActivity mainActivity;
    private String oAuthVerifier;

    private SharedPreferences sharedPreferences;
    private SharedPreferences.Editor editor;

    private AccessToken accessToken;
    private String useScreenName;

    private ProgressDialog progressDialog;

    public GetAccessTokenTask(MainActivity mainActivity, String oAuthVerifier) {
        this.mainActivity = mainActivity;
        this.oAuthVerifier = oAuthVerifier;

        this.useScreenName = null;
    }

    @Override
    protected void onPreExecute() {
        progressDialog = new ProgressDialog(mainActivity);
        progressDialog.setMessage(mainActivity.getString(R.string.main_pd_get_access_token));
        progressDialog.setCancelable(false);
        progressDialog.show();

        sharedPreferences = mainActivity.getSharedPreferences(mainActivity.getString(R.string.sp_tweetin), Context.MODE_PRIVATE);
        editor = sharedPreferences.edit();
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        String consumerKey = mainActivity.getString(R.string.app_consumer_key);
        String consumerSecret = mainActivity.getString(R.string.app_consumer_secret);

        Twitter twitter = TwitterUnit.getTwitterFromInstance();
        twitter.setOAuthConsumer(consumerKey, consumerSecret);

        try {
            String token = sharedPreferences.getString(mainActivity.getString(R.string.sp_request_token), null);
            String tokenSecret = sharedPreferences.getString(mainActivity.getString(R.string.sp_request_token_secret), null);
            RequestToken requestToken = new RequestToken(token, tokenSecret);

            accessToken = twitter.getOAuthAccessToken(requestToken, oAuthVerifier);
            useScreenName = twitter.verifyCredentials().getScreenName();
        } catch (Exception e) {
            return false;
        }

        if (isCancelled()) {
            return false;
        }
        return true;
    }

    @Override
    protected void onCancelled() {}

    @Override
    protected void onPostExecute(Boolean result) {
        if (result) {
            editor.putString(mainActivity.getString(R.string.sp_use_screen_name), useScreenName);
            editor.putString(mainActivity.getString(R.string.sp_access_token), accessToken.getToken());
            editor.putString(mainActivity.getString(R.string.sp_access_token_secret), accessToken.getTokenSecret());
            editor.commit();

            mainActivity.initUI();

            progressDialog.hide();
            progressDialog.dismiss();

            Toast.makeText(mainActivity, mainActivity.getString(R.string.main_toast_initializing), Toast.LENGTH_SHORT).show();
        } else {
            editor.putString(mainActivity.getString(R.string.sp_request_token), null);
            editor.putString(mainActivity.getString(R.string.sp_request_token_secret), null);
            editor.commit();

            progressDialog.hide();
            progressDialog.dismiss();

            Toast.makeText(mainActivity, mainActivity.getString(R.string.main_toast_get_access_token_failed), Toast.LENGTH_LONG).show();
        }
    }
}