import MapplsPlacePicker from './MapplsPlacePicker';
import Components, { PlaceWidgetProps } from './components';

import { NativeModules } from 'react-native';

// Type the constants retrieved from native module
interface MapplsConstants {
  POD_SUB_LOCALITY_KEY: string;
  POD_LOCALITY_KEY: string;
  POD_CITY_KEY: string;
  POD_VILLAGE_KEY: string;
  POD_SUB_DISTRICT_KEY: string;
  POD_DISTRICT_KEY: string;
  POD_STATE_KEY: string;
  POD_SUB_SUB_LOCALITY_KEY: string;
  GRAVITY_LEFT_KEY: string;
  GRAVITY_CENTER_KEY: string;
  GRAVITY_RIGHT_KEY: string;
  GRAVITY_TOP_KEY: string;
  GRAVITY_BOTTOM_KEY: string;
  SIZE_SMALL_KEY: string;
  SIZE_MEDIUM_KEY: string;
  SIZE_LARGE_KEY: string;
}

// Type the native module to help with auto-complete & safety
interface MapplsPlacePickerModule {
  getConstants: () => MapplsConstants;
}

const { MapplsReactNativePlacePicker } = NativeModules as {
  MapplsReactNativePlacePicker: MapplsPlacePickerModule;
};

const {
  POD_SUB_LOCALITY_KEY,
  POD_LOCALITY_KEY,
  POD_CITY_KEY,
  POD_VILLAGE_KEY,
  POD_SUB_DISTRICT_KEY,
  POD_DISTRICT_KEY,
  POD_STATE_KEY,
  POD_SUB_SUB_LOCALITY_KEY,
  GRAVITY_LEFT_KEY,
  GRAVITY_CENTER_KEY,
  GRAVITY_RIGHT_KEY,
  GRAVITY_TOP_KEY,
  GRAVITY_BOTTOM_KEY,
  SIZE_SMALL_KEY,
  SIZE_MEDIUM_KEY,
  SIZE_LARGE_KEY,
} = MapplsReactNativePlacePicker.getConstants();

const MapplsUIWidgets = {
  searchWidget: async (props: PlaceWidgetProps): Promise<any> =>
    Components.openPlaceWidget(props),

  PlacePicker: MapplsPlacePicker,

  // Pods
  POD_SUB_LOCALITY: POD_SUB_LOCALITY_KEY,
  POD_LOCALITY: POD_LOCALITY_KEY,
  POD_CITY: POD_CITY_KEY,
  POD_VILLAGE: POD_VILLAGE_KEY,
  POD_SUB_DISTRICT: POD_SUB_DISTRICT_KEY,
  POD_DISTRICT: POD_DISTRICT_KEY,
  POD_STATE: POD_STATE_KEY,
  POD_SUB_SUB_LOCALITY: POD_SUB_SUB_LOCALITY_KEY,

  // Attribution Horizontal Alignment
  GRAVITY_LEFT: GRAVITY_LEFT_KEY,
  GRAVITY_CENTER: GRAVITY_CENTER_KEY,
  GRAVITY_RIGHT: GRAVITY_RIGHT_KEY,

  // Attribution Vertical Alignment
  GRAVITY_TOP: GRAVITY_TOP_KEY,
  GRAVITY_BOTTOM: GRAVITY_BOTTOM_KEY,

  // Logo Size
  SIZE_SMALL: SIZE_SMALL_KEY,
  SIZE_MEDIUM: SIZE_MEDIUM_KEY,
  SIZE_LARGE: SIZE_LARGE_KEY,
};

export default MapplsUIWidgets;
