package com.slowpath.actionsheet;

import android.app.Activity;

import com.facebook.react.ReactFragmentActivity;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Nullable;
import com.baoyz.actionsheet.ActionSheet;

public class ActionSheetModule extends ReactContextBaseJavaModule implements ActionSheet.ActionSheetListener {

    private static final int RESULT_CANCEL = -1;
    private static final int RESULT_ERROR = -2;

    private ReactFragmentActivity activity;
    private Callback callback;
    private ReactApplicationContext context;

    public ActionSheetModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.context = reactContext;
        this.callback = null;
    }

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

    public @Nullable Map<String, Object> getConstants() {
        Map<String, Object> constants = new HashMap<>();

        constants.put("RESULT_CANCEL", RESULT_CANCEL);
        constants.put("RESULT_ERROR", RESULT_ERROR);

        return constants;
    }

    @ReactMethod
    public void showActionSheetWithOptions(ReadableMap params, Callback callback) {
        final Activity currentActivity = getCurrentActivity();
        if (currentActivity == null || !(currentActivity instanceof ReactFragmentActivity)) {
            this.callback.invoke(RESULT_ERROR);
            return;
        }
        this.activity = (ReactFragmentActivity) currentActivity;
        this.callback = callback;
        int cancelButtonIndex = params.getInt("cancelButtonIndex");
        ReadableArray options = params.getArray("options");
        List<String> list = new ArrayList<>(options.size());
        String cancelButtonName = options.getString(cancelButtonIndex);

        for (int i = 0; i < options.size(); ++i) {
          String value = options.getString(i);
          if (!value.equals(cancelButtonName)) {
            list.add(value);
          }
        }

        String[] args = new String[list.size()];

        ActionSheet.createBuilder(context, activity.getSupportFragmentManager())
                  .setCancelButtonTitle(cancelButtonName)
                  .setOtherButtonTitles(list.toArray(args))
                  .setCancelableOnTouchOutside(false)
                  .setListener(this).show();
    }

    @Override
    public void onOtherButtonClick(ActionSheet actionSheet, int index) {
      if (callback != null) {
        callback.invoke(index);
      }
    }

    @Override
    public void onDismiss(ActionSheet actionSheet, boolean isCancle) {
      if (callback != null && isCancle) {
        callback.invoke(RESULT_CANCEL);
      }
    }

  }