
package com.reactlibrary;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.Arguments;

import androidx.annotation.NonNull;

import whispersky.*;

public class RNWhisperSkyLibraryModule extends ReactContextBaseJavaModule {

  private final ReactApplicationContext reactContext;

  public RNWhisperSkyLibraryModule(ReactApplicationContext reactContext) {
    super(reactContext);
    this.reactContext = reactContext;
  }

  @Override
  public String getName() {
    return "RNWhisperSkyLibrary";
  }

  @ReactMethod
  public void createWhisperID(Promise promise) {
    WhisperID whisperID;
    try {
      whisperID = Whispersky.createWhisperID();
    } catch (Exception e) {
      promise.reject(e.getMessage());
      return;
    }

    WritableMap map = Arguments.createMap();
    map.putString("address", whisperID.getAddress()); // by calling golang library
    map.putString("seed", whisperID.getSeed());
    map.putString("privateKey", whisperID.getPrivateKey());
    map.putString("publicKey", whisperID.getPublicKey());

    promise.resolve(map);
  }

  @ReactMethod
  public void isValidSkyAddress(@NonNull String address, Promise promise) {
    promise.resolve(Whispersky.isValidSkyAddress(address));
  }

  @ReactMethod
  public void isValidPrivateKey(@NonNull String address, @NonNull String privateKey, Promise promise) {
    promise.resolve(Whispersky.isValidPrivateKey(address, privateKey));
  }

  @ReactMethod
  public void setSkycoinNode(@NonNull String skynode, Promise promise) {
    try {
      Whispersky.setSkycoinNode(skynode);
    } catch (Exception e) {
      promise.reject(e.getMessage());
      return;
    }
    promise.resolve(true);
  }

  @ReactMethod
  public void setupWalletEntry(@NonNull String privateKey, Promise promise) {
    try {
      Whispersky.setupWalletEntry(privateKey);
    } catch (Exception e) {
      promise.reject(e.getMessage());
      return;
    }

    promise.resolve(true);
  }

  @ReactMethod
  public void getBalanceOfAddress(@NonNull String addr, Promise promise) {
    String balance = "0.0";
    try {
      balance = Whispersky.getBalanceOfAddress(addr);
    } catch (Exception e) {
      promise.reject(e.getMessage());
      return;
    }

    promise.resolve(balance);
  }

  @ReactMethod
  public void sendCoins(@NonNull String toAddr, @NonNull String amount, Promise promise) {
    String txid = "";
    try {
      txid = Whispersky.sendCoins(toAddr, amount);
    } catch (Exception e) {
      promise.reject(e.getMessage());
      return;
    }

    promise.resolve(txid);
  }

}