package is.uncommon.rn.widgets;

import android.view.View;
import com.facebook.infer.annotation.Assertions;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.uimanager.PixelUtil;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.annotations.ReactProp;
import java.util.Map;
import javax.annotation.Nullable;

/**
 * Created by madhu on 08/03/17.
 */
@ReactModule(name = TabbedViewPagerManager.REACT_CLASS) public class TabbedViewPagerManager
    extends ViewGroupManager<TabbedViewPager> {
  protected static final String REACT_CLASS = "TabbedViewPager";
  public static final int COMMAND_SET_PAGE = 1;
  public static final int COMMAND_SET_PAGE_WITHOUT_ANIMATION = 2;

  public TabbedViewPagerManager() {

  }

  @Override public String getName() {
    return REACT_CLASS;
  }

  @Override protected TabbedViewPager createViewInstance(ThemedReactContext reactContext) {
    TabbedViewPager viewPager = new TabbedViewPager(reactContext);
    viewPager.setup(reactContext);
    return viewPager;
  }

  @Override public void onDropViewInstance(TabbedViewPager view) {
    super.onDropViewInstance(view);
    view.handleViewDropped();
  }

  //tab properties -- start
  @ReactProp(name = "tabMode") public void setTabProperties(TabbedViewPager viewPager,
      String tabMode) {
    viewPager.setTabMode(tabMode);
  }

  @ReactProp(name = "tabGravity")
  public void setTabGravity(TabbedViewPager viewPager, String tabGravity) {
    viewPager.setTabGravity(tabGravity);
  }

  @ReactProp(name = "tabBackground")
  public void setTabBackground(TabbedViewPager viewPager, int tabBackgroundColor) {
    viewPager.setTabBackgroundColor(tabBackgroundColor);
  }

  @ReactProp(name = "tabIndicatorColor")
  public void setTabIndicatorColor(TabbedViewPager viewPager, int tabIndicatorColor) {
    viewPager.setTabIndicatorColor(tabIndicatorColor);
  }

  @ReactProp(name = "tabSelectedTextColor")
  public void setTabSelectedTextColor(TabbedViewPager viewPager, int tabSelectedTextColor) {
    viewPager.setTabSelectedTextColor(tabSelectedTextColor);
  }

  @ReactProp(name = "tabTextColor")
  public void setTabTextColor(TabbedViewPager viewPager, int tabTextColor) {
    viewPager.setTabTextColor(tabTextColor);
  }

  @ReactProp(name = "tabIndicatorHeight")
  public void setTabIndicatorHeight(TabbedViewPager viewPager, float tabIndicatorHeight) {
    viewPager.setTabIndicatorHeight(PixelUtil.toPixelFromDIP(tabIndicatorHeight));
  }

  @ReactProp(name = "tabElevation")
  public void setTabElevation(TabbedViewPager viewPager, float tabElevation) {
    viewPager.setTabElevation(PixelUtil.toPixelFromDIP(tabElevation));
  }

  @ReactProp(name = "tabNames")
  public void setTabNames(TabbedViewPager viewPager, ReadableArray readableArray) {
    String[] names = new String[readableArray.size()];
    for (int i = 0; i < readableArray.size(); i++) {
      names[i] = readableArray.getString(i);
    }
    viewPager.setTabNames(names);
  }

  //tab properties -- end

  @ReactProp(name = "scrollEnabled", defaultBoolean = true)
  public void setScrollEnabled(TabbedViewPager viewPager, boolean value) {
    viewPager.setScrollEnabled(value);
  }

  @Override public boolean needsCustomLayoutForChildren() {
    return true;
  }

  @Override public Map getExportedCustomDirectEventTypeConstants() {
    return MapBuilder.of(PageScrollEvent.EVENT_NAME,
        MapBuilder.of("registrationName", "onPageScroll"), PageScrollStateChangedEvent.EVENT_NAME,
        MapBuilder.of("registrationName", "onPageScrollStateChanged"), PageSelectedEvent.EVENT_NAME,
        MapBuilder.of("registrationName", "onPageSelected"));
  }

  @Override public Map<String, Integer> getCommandsMap() {
    return MapBuilder.of("setPage", COMMAND_SET_PAGE, "setPageWithoutAnimation",
        COMMAND_SET_PAGE_WITHOUT_ANIMATION);
  }

  @Override public void receiveCommand(TabbedViewPager viewPager, int commandType,
      @Nullable ReadableArray args) {
    Assertions.assertNotNull(viewPager);
    Assertions.assertNotNull(args);
    switch (commandType) {
      case COMMAND_SET_PAGE: {
        viewPager.setCurrentItemFromJs(args.getInt(0), true);
        return;
      }
      case COMMAND_SET_PAGE_WITHOUT_ANIMATION: {
        viewPager.setCurrentItemFromJs(args.getInt(0), false);
        return;
      }
      default:
        throw new IllegalArgumentException(
            String.format("Unsupported command %d received by %s.", commandType,
                getClass().getSimpleName()));
    }
  }

  @Override public void addView(TabbedViewPager parent, View child, int index) {
    parent.addViewToAdapter(child, index);
  }

  @Override public int getChildCount(TabbedViewPager parent) {
    return parent.getViewCountInAdapter();
  }

  @Override public View getChildAt(TabbedViewPager parent, int index) {
    return parent.getViewFromAdapter(index);
  }

  @Override public void removeViewAt(TabbedViewPager parent, int index) {
    parent.removeViewFromAdapter(index);
  }

  @Override public void removeAllViews(TabbedViewPager parent) {
    parent.removeAllViewsFromAdapter();
  }

  @ReactProp(name = "pageMargin", defaultFloat = 0)
  public void setPageMargin(TabbedViewPager pager, float margin) {
    pager.setPageMargin((int) PixelUtil.toPixelFromDIP(margin));
  }
}