package com.castlabs.reactnative.thumbnails;

import android.os.Build;

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

import com.castlabs.reactnative.PrestoPlayPackage;
import com.castlabs.reactnative.thumbnails.arch_new.NativeThumbnailFactoryModule;
import com.facebook.react.BaseReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.module.model.ReactModuleInfo;
import com.facebook.react.module.model.ReactModuleInfoProvider;
import com.facebook.react.uimanager.ViewManager;

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

/**
 * Bundles media views and modules.
 */
@RequiresApi(api = Build.VERSION_CODES.N)
public class RNPrestoplayThumbnailPackage extends BaseReactPackage {

  @NonNull
  @Override
  public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext context) {
    return List.of(
        new com.castlabs.reactnative.thumbnails.arch_new.RNPrestoplayThumbnailViewManager(context, PrestoPlayPackage.playerInstanceManager)
    );
  }

  @Nullable
  @Override
  public NativeModule getModule(@NonNull String name, @NonNull ReactApplicationContext reactApplicationContext) {
    if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
      /*
        Bridgeless (new) architecture
      */
      if (name.equals(NativeThumbnailFactoryModule.NAME)) {
        return new NativeThumbnailFactoryModule(reactApplicationContext);
      }
    } else {
      /*
        Bridge (old) architecture
      */
      if (name.equals(RNPrestoplayThumbnailPluginFactory.REACT_CLASS)) {
        return new RNPrestoplayThumbnailPluginFactory(reactApplicationContext);
      }
    }
    return null;
  }

  @NonNull
  @Override
  public ReactModuleInfoProvider getReactModuleInfoProvider() {
    return new ReactModuleInfoProvider() {
      @NonNull
      @Override
      public Map<String, ReactModuleInfo> getReactModuleInfos() {
        Map<String, ReactModuleInfo> map = new HashMap<>();

        if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
          map.put(NativeThumbnailFactoryModule.NAME, new ReactModuleInfo(
                  NativeThumbnailFactoryModule.NAME, // name
                  NativeThumbnailFactoryModule.NAME, // className
                  false, // canOverrideExistingModule
                  true,  // needsEagerInit
                  false, // isCXXModule
                  true   // isTurboModule
          ));
        } else {
          map.put(RNPrestoplayThumbnailPluginFactory.REACT_CLASS, new ReactModuleInfo(
                  RNPrestoplayThumbnailPluginFactory.REACT_CLASS, // name
                  RNPrestoplayThumbnailPluginFactory.REACT_CLASS, // className
                  false, // canOverrideExistingModule
                  false, // needsEagerInit
                  false, // isCXXModule
                  false  // isTurboModule
          ));
        }
        return map;
      }
    };
  }
}
