package io.clef.cordova;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

import org.jdeferred.DoneCallback;
import org.jdeferred.FailCallback;

import java.util.UUID;

import io.clef.cordova.Plugin;

import static timber.log.Timber.*;
import android.view.View;
import android.widget.RelativeLayout;

final public class LoginCompatActivity extends FragmentActivity {
    public final static String ACTION_SIGN_IN = "signIn";
    public final static String ACTION_REGISTER = "register";
    final static String INTENT_RESULT_VALUE = "Result.Value";
    final static String INTENT_RESULT_ERROR = "Result.Error";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final String event = getIntent().getExtras().getString("action");

        switch (event) {
            case ACTION_SIGN_IN:
                invokeSignIn();
                break;

            case ACTION_REGISTER:
                invokeRegister();
                break;

            default:
                w("Unknown requested action: %s", event);
        }
    }

    void invokeSignIn() {
        Plugin.client.signIn(getSupportFragmentManager())
          .then(new DoneCallback<String>() {
              @Override
              public void onDone(final String result) {
                  v("We got the following: %s", result);
                  LoginCompatActivity.this.dispatchResult(result);
                  Plugin.cb.success(result);
                  LoginCompatActivity.this.finish();
              }
          }, new FailCallback<Exception>() {
              @Override
              public void onFail(final Exception failure) {
                  d(failure, "We got an error.");
                  LoginCompatActivity.this.dispatchResult(failure);
                  Plugin.cb.error(failure.getMessage());
                  LoginCompatActivity.this.finish();
              }
          });
    }

    void invokeRegister() {
        Plugin.client.registerDevice(getSupportFragmentManager())
          .then(new DoneCallback<UUID>() {
              @Override
              public void onDone(final UUID result) {
                  v("We got the following from registeration: %s", result);
                  LoginCompatActivity.this.dispatchResult(result);
                  Plugin.cb.success(result.toString());
                  LoginCompatActivity.this.finish();
              }
          }, new FailCallback<Throwable>() {
              @Override
              public void onFail(final Throwable failure) {
                  d(failure, "We got an error on registration.");
                  LoginCompatActivity.this.dispatchResult(failure);
                  Plugin.cb.error(failure.getMessage());
                  LoginCompatActivity.this.finish();
              }
          });
    }

    public void dispatchResult(final Object result) {
        final Intent intent = getIntent();
        intent.putExtra(INTENT_RESULT_VALUE, result.toString());
        setResult(Activity.RESULT_OK, intent);
    }

    public void dispatchResult(final Exception error) {
        final Intent intent = getIntent();
        intent.putExtra(INTENT_RESULT_ERROR, error);
        setResult(Activity.RESULT_CANCELED, intent);
    }
}
