package com.a11yorder.views.A11yIndexView;

import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.a11yorder.events.EventHelper;
import com.a11yorder.events.ScreenReaderFocusChangedEvent;
import com.a11yorder.utils.A11yHelper;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.views.view.ReactViewGroup;

import java.util.HashMap;
import java.util.Map;


@ReactModule(name = A11yIndexViewManager.NAME)
public class A11yIndexViewManager extends com.a11yorder.A11yIndexViewManagerSpec<A11yIndexView> {

  public static final String NAME = "A11yIndexView";

  @NonNull
  @Override
  public String getName() {
    return NAME;
  }

  @NonNull
  @Override
  public A11yIndexView createViewInstance(@NonNull ThemedReactContext context) {
    return new A11yIndexView(context);
  }

  @Override
  @ReactProp(name = "orderIndex")
  public void setOrderIndex(A11yIndexView viewGroup, int value) {
    viewGroup.setIndex(value);
  }

  @Override
  @ReactProp(name = "orderKey")
  public void setOrderKey(A11yIndexView viewGroup, String value) {
    viewGroup.setOrderKey(value);
  }

  @Override
  @ReactProp(name = "orderFocusType")
  public void setOrderFocusType(A11yIndexView viewGroup, int value) {
    viewGroup.setOrderFocusType(value);
  }

  @Override
  public void focus(A11yIndexView view) {
    this.focus((ReactViewGroup) view);
  }

  private <T extends ReactViewGroup> void focus(T view) {
    View firstAccessible = A11yHelper.findFirstAccessible(view, true);
    A11yHelper.focus(firstAccessible);
  }

  @Override
  public void receiveCommand(ReactViewGroup root, String commandId, @Nullable ReadableArray args) {
    if (commandId.equals("focus")) {
      this.focus(root);
    } else {
      super.receiveCommand(root, commandId, args);
    }
  }

  @Override
  public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
    Map<String, Object> export = new HashMap<>();

    export.put(ScreenReaderFocusChangedEvent.EVENT_NAME, EventHelper.buildDirectEventMap("onScreenReaderFocusChange"));

    return export;
  }
}
