/**
 * Copyright (c) 2015-present, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */

package com.rnboat.framework.base;

import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;

import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import com.facebook.react.modules.core.PermissionAwareActivity;
import com.facebook.react.modules.core.PermissionListener;

import javax.annotation.Nullable;

/**
 * Base Activity for React Native applications.
 */
public abstract class ReactActivity extends BaseActivity
        implements DefaultHardwareBackBtnHandler, PermissionAwareActivity {

  protected RNBoatReactActivityDelegate mDelegate;

  /**
   * Returns the name of the main component registered from JavaScript.
   * This is used to schedule rendering of the component.
   * e.g. "MoviesApp"
   */
  protected @Nullable String getMainComponentName() {
    return null;
  }

  /**
   * Called at construction time, override if you have a custom delegate implementation.
   */
  protected RNBoatReactActivityDelegate createReactActivityDelegate(String jsBundlePath, Bundle launchOptions, Bundle savedInstanceState) {
    mDelegate = new RNBoatReactActivityDelegate(this, getMainComponentName());
    mDelegate.setLaunchOptions(launchOptions);
    mDelegate.initNativeHost(jsBundlePath);
    mDelegate.onCreate(savedInstanceState);
    return mDelegate;
  }

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

  @Override
  protected void onPause() {
    super.onPause();
    if (mDelegate != null)
      mDelegate.onPause();
  }

  @Override
  protected void onResume() {
    super.onResume();
    if (mDelegate != null)
      mDelegate.onResume();
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    if (mDelegate != null)
      mDelegate.onDestroy();
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (mDelegate != null)
      mDelegate.onActivityResult(requestCode, resultCode, data);
  }

  @Override
  public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (mDelegate != null)
      return mDelegate.onKeyUp(keyCode, event) || super.onKeyUp(keyCode, event);
    else
      return super.onKeyUp(keyCode, event);
  }

  @Override
  public void onBackPressed() {
    if (mDelegate != null && !mDelegate.onBackPressed()) {
      super.onBackPressed();
    }
    else if (mDelegate == null) {
      super.onBackPressed();
    }
  }

  @Override
  public void invokeDefaultOnBackPressed() {
    super.onBackPressed();
  }

  @Override
  public void onNewIntent(Intent intent) {
    if (mDelegate != null && !mDelegate.onNewIntent(intent)) {
      super.onNewIntent(intent);
    }
    else if (mDelegate == null){
      super.onNewIntent(intent);
    }
  }

  @Override
  public void requestPermissions(
          String[] permissions,
          int requestCode,
          PermissionListener listener) {
    if (mDelegate != null)
      mDelegate.requestPermissions(permissions, requestCode, listener);
  }

  @Override
  public void onRequestPermissionsResult(
          int requestCode,
          String[] permissions,
          int[] grantResults) {
    if (mDelegate != null)
      mDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
  }
}
