package com.ahmedadel.socialmediasignup;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;

import com.ahmedadel.socialmediasignup.model.SocialMediaUser;
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookAuthorizationException;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;

import org.json.JSONObject;

import java.util.List;

/**
 * Created by Ahmed Adel on 2/16/18.
 * <p>
 * FacebookSignUpActivity is the activity that handle all the logic behind facebook sdk and that will be launched
 * once the developer chooses facebook social type.
 */

public class FacebookSignUpActivity extends SocialMediaSignUpActivity
        implements FacebookCallback<LoginResult>, GraphRequest.GraphJSONObjectCallback {

    private static final String PROFILE_PIC_URL = "https://graph.facebook.com/%1$s/picture?type=large";

    private CallbackManager callbackManager;

    public static void start(Context context) {
        Intent intent = new Intent(context, FacebookSignUpActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        callbackManager = CallbackManager.Factory.create();

        LoginManager.getInstance().registerCallback(callbackManager, this);
        LoginManager.getInstance().logInWithReadPermissions(this, getScopes());
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected SocialMediaData getAuthData() {
        return SocialMediaSignUp.getInstance().getFacebookData();
    }

    @Override
    public void onSuccess(LoginResult loginResult) {
        startLoading();
        GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), this);
        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,name,email,link");
        request.setParameters(parameters);
        request.executeAsync();
    }

    @Override
    public void onCancel() {
        handCancel(SocialMediaSignUp.SocialMediaType.FACEBOOK);
    }

    @Override
    public void onError(FacebookException error) {
        handleError(error);
        if (error instanceof FacebookAuthorizationException)
            LoginManager.getInstance().logOut();
    }

    @Override
    public void onCompleted(JSONObject object, GraphResponse response) {
        SocialMediaUser user = new SocialMediaUser();
        user.setUserId(object.optString("id"));
        user.setAccessToken(AccessToken.getCurrentAccessToken().getToken());
        user.setProfilePictureUrl(String.format(PROFILE_PIC_URL, user.getUserId()));
        user.setEmail(object.optString("email"));
        user.setFullName(object.optString("name"));
        user.setPageLink(object.optString("link"));
        loadingDialog.dismiss();
        handleSuccess(SocialMediaSignUp.SocialMediaType.FACEBOOK, user);
    }

    private List<String> getScopes() {
        return getAuthData().getScopes();
    }
}