package mil.nga.giat.mage.login;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import androidx.fragment.app.FragmentActivity;

import com.google.gson.JsonObject;

import mil.nga.giat.mage.R;
import mil.nga.giat.mage.disclaimer.DisclaimerActivity;
import mil.nga.giat.mage.event.EventsActivity;
import mil.nga.giat.mage.sdk.login.AbstractAccountTask;
import mil.nga.giat.mage.sdk.login.AccountDelegate;
import mil.nga.giat.mage.sdk.login.AccountStatus;
import mil.nga.giat.mage.sdk.login.OAuthLoginTask;
import mil.nga.giat.mage.sdk.login.OAuthSignupTask;
import mil.nga.giat.mage.sdk.utils.DeviceUuidFactory;

/**
 * Created by wnewman on 10/14/15.
 */
public class OAuthActivity extends FragmentActivity implements AccountDelegate {

    public enum OAuthType {
        SIGNIN,
        SIGINUP
    }

    private static final String LOG_NAME = OAuthActivity.class.getName();

    public static final String EXTRA_SERVER_URL = "EXTRA_SERVER_URL";
    public static final String EXTRA_OAUTH_TYPE = "EXTRA_OAUTH_TYPE";
    public static final String EXTRA_OAUTH_STRATEGY = "EXTRA_OAUTH_STRATEGY";

    private String serverURL;
    private String oauthURL;
    private OAuthType oauthType;
    private String oauthStrategy;

    private WebView webView;
    private View progress;
    private String uuid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_oauth);

        serverURL = getIntent().getStringExtra(EXTRA_SERVER_URL);
        oauthType = (OAuthType) getIntent().getSerializableExtra(EXTRA_OAUTH_TYPE);
        oauthStrategy = getIntent().getStringExtra(EXTRA_OAUTH_STRATEGY);
        oauthURL = String.format("%s/auth/%s/signin", serverURL, oauthStrategy);

        uuid = new DeviceUuidFactory(this).getDeviceUuid().toString();

        progress = findViewById(R.id.progress);

        webView = (WebView) findViewById(R.id.webView);
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        webView.addJavascriptInterface(this, "Android");
        webView.setWebViewClient(new WebViewClient() {
            public void onPageFinished(WebView view, String url) {
                progress.setVisibility(View.INVISIBLE);

                 if (url.contains("/callback")) {
                    webView.setVisibility(View.INVISIBLE);
                    webView.loadUrl("javascript:Android.getLogin(JSON.stringify(login));");
                }
            }
        });

        webView.loadUrl(oauthURL);
    }

    @JavascriptInterface
    public void getLogin(String login) {
        AbstractAccountTask loginTask = oauthType == OAuthType.SIGNIN ?
                new OAuthLoginTask(this, getApplicationContext()) :
                new OAuthSignupTask(this, getApplicationContext());

        loginTask.execute(new String[]{ oauthStrategy, uuid, login });
    }

    @Override
    public void finishAccount(AccountStatus accountStatus) {
        if (accountStatus.getStatus().equals(AccountStatus.Status.SUCCESSFUL_LOGIN)) {
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
            boolean showDisclaimer = sharedPreferences.getBoolean(getString(R.string.serverDisclaimerShow), false);

            Intent intent = showDisclaimer ?
                    new Intent(getApplicationContext(), DisclaimerActivity.class) :
                    new Intent(getApplicationContext(), EventsActivity.class);

            startActivity(intent);
            finish();
        } else if (accountStatus.getStatus().equals(AccountStatus.Status.SUCCESSFUL_REGISTRATION)) {
            Intent intent = new Intent();
            intent.putExtra(LoginActivity.EXTRA_OAUTH_UNREGISTERED_DEVICE, true);
            setResult(RESULT_OK, intent);
            finish();
        } else if (accountStatus.getStatus().equals(AccountStatus.Status.SUCCESSFUL_SIGNUP)) {
            Intent intent = new Intent();
            setResult(RESULT_OK, intent);
            finish();
        } else if (accountStatus.getStatus().equals(AccountStatus.Status.FAILED_SIGNUP)) {
            JsonObject json = accountStatus.getAccountInformation();
            String errorMessage = "Your account could not be created, please contact your MAGE administrator";

            if (json.has("errorMessage")) {
                errorMessage = json.get("errorMessage").getAsString();
            }

            Intent intent = new Intent();
            intent.putExtra(SignupActivity.EXTRA_OAUTH_ERROR, true);
            intent.putExtra(SignupActivity.EXTRA_OAUTH_ERROR_MESSAGE, errorMessage);
            setResult(RESULT_OK, intent);
            finish();
        } else {
            Intent intent = new Intent();
            intent.putExtra(LoginActivity.EXTRA_OAUTH_ERROR, true);
            setResult(RESULT_OK, intent);
            finish();
        }
    }
}