import { UIManager, Platform } from 'react-native';
import {
  JIBESTREAM_DESTINATION,
  JIBESTREAM_STYLE,
  MAP_COMPASS_PROPERTIES,
  MAP_CREDENTIALS,
  MAP_FLOOR_SELECTOR_PROPERTIES,
  MAP_SEARCH_PROPERTIES,
  MAP_ZOOM_BUTTON_PROPERTIES,
} from './JibestreamTypes';


interface MapViewManagerCommandMappings {
  create: number | string,
  center: number | string,
  setMapVenue: number | string,
  centerMapOnPoint: number | string,
  setFollowBlueDot: number | string,
  setUserPosition: number | string,
  setUserPositionXY: number | string,
  clearWayfindingPath: number | string,
  wayfindToWaypoint: number | string,
  wayfindBetweenWaypoints: number | string,
  drawNavigationPath: number | string,
  styleUnitsForDestination: number | string,
  styleShape: number | string,
}

let MapViewManagerCommands: MapViewManagerCommandMappings = {
  create: 1,
  center: 2,
  setMapVenue: 3,
  centerMapOnPoint: 4,
  setFollowBlueDot: 5,
  setUserPosition: 6,
  setUserPositionXY: 7,
  clearWayfindingPath: 8,
  wayfindToWaypoint: 9,
  wayfindBetweenWaypoints: 10,
  drawNavigationPath: 11,
  styleUnitsForDestination: 12,
  styleShape: 13,
};
if (Platform.OS == 'ios'){
  MapViewManagerCommands = {
    create: "create",
    center: "center",
    setMapVenue: "setMapVenue",
    centerMapOnPoint: "centerMapOnPoint",
    setFollowBlueDot: "setFollowBlueDot",
    setUserPosition: "setUserPosition",
    setUserPositionXY: "setUserPositionXY",
    clearWayfindingPath: "clearWayfindingPath",
    wayfindToWaypoint: "wayfindToWaypoint",
    wayfindBetweenWaypoints: "wayfindBetweenWaypoints",
    drawNavigationPath: "drawNavigationPath",
    styleUnitsForDestination: "styleUnitsForDestination",
    styleShape: "styleShape",
  };
}






export const createFragment = (viewId: number | null) =>
  UIManager.dispatchViewManagerCommand(
    viewId,
    MapViewManagerCommands.create.toString(),
    [viewId]
  );

export const centerMap = (
  viewId: number | null,
  rotation: number,
  animationDuration: number
) =>
  UIManager.dispatchViewManagerCommand(
    viewId,
    MapViewManagerCommands.center.toString(),
    [rotation, animationDuration]
  );

export function getRandomInt(max: number) {
  return Math.floor(Math.random() * max);
}

export const setMapVenue = ({
  viewId,
  credentials,
  compass,
  floorSelector,
  zoomButtons,
  search,
}: {
  viewId: number | null;
  credentials: MAP_CREDENTIALS;
  compass?: MAP_COMPASS_PROPERTIES;
  floorSelector?: MAP_FLOOR_SELECTOR_PROPERTIES;
  zoomButtons?: MAP_ZOOM_BUTTON_PROPERTIES;
  search?: MAP_SEARCH_PROPERTIES;
}) =>
  UIManager.dispatchViewManagerCommand(
    viewId,
    MapViewManagerCommands.setMapVenue.toString(),
    [credentials, compass, floorSelector, zoomButtons, search]
  );

export const centerMapOnPoint = (viewId: number | null, point: number[]) =>
  UIManager.dispatchViewManagerCommand(
    viewId,
    MapViewManagerCommands.centerMapOnPoint.toString(),
    [point]
  );

export const setFollowBlueDot = (
  viewId: number | null,
  enabled: boolean,
  rotate: boolean = false,
  interval: number = 500
) =>
  UIManager.dispatchViewManagerCommand(
    viewId,
    MapViewManagerCommands.setFollowBlueDot.toString(),
    [enabled, rotate, interval]
  );

export const setUserPosition = (
  viewId: number | null,
  x: number,
  y: number,
  heading: number,
  format?: string
) =>
  UIManager.dispatchViewManagerCommand(
    viewId,
    MapViewManagerCommands.setUserPosition.toString(),
    [x, y, heading, format]
  );

export const clearWayfindingPath = (viewId: number | null) =>
  UIManager.dispatchViewManagerCommand(
    viewId,
    MapViewManagerCommands.clearWayfindingPath.toString(),
    []
  );

export const wayfindToWaypoint = (viewId: number | null, waypointId: number) =>
  UIManager.dispatchViewManagerCommand(
    viewId,
    MapViewManagerCommands.wayfindToWaypoint.toString(),
    [waypointId]
  );

export const wayfindBetweenWaypoints = (
  viewId: number | null,
  originId: number,
  destinationId: number
) =>
  UIManager.dispatchViewManagerCommand(
    viewId,
    MapViewManagerCommands.wayfindBetweenWaypoints.toString(),
    [originId, destinationId]
  );

export const drawNavigationPath = (
  viewId: number | null,
  pathId: string,
  shouldFocus?: boolean,
  style?: JIBESTREAM_STYLE
) =>
  UIManager.dispatchViewManagerCommand(
    viewId,
    MapViewManagerCommands.drawNavigationPath.toString(),
    [pathId, shouldFocus, style]
  );

export const styleUnitsForDestination = (
  viewId: number | null,
  destination: JIBESTREAM_DESTINATION,
  style?: JIBESTREAM_STYLE
) =>
  UIManager.dispatchViewManagerCommand(
    viewId,
    MapViewManagerCommands.styleUnitsForDestination.toString(),
    [destination, style]
  );

export const styleShape = (
  viewId: number | null,
  id: number,
  style?: JIBESTREAM_STYLE
) =>
  UIManager.dispatchViewManagerCommand(
    viewId,
    MapViewManagerCommands.styleShape.toString(),
    [id, style]
  );

//   export type MAP_VIEW_REFERENCE = {
//     setMapVenue: ({
//       credentials,
//       compass,
//       floorSelector,
//       zoomButtons,
//       search,
//     }: {
//       credentials: MAP_CREDENTIALS;
//       compass?: MAP_COMPASS_PROPERTIES;
//       floorSelector?: MAP_FLOOR_SELECTOR_PROPERTIES;
//       zoomButtons?: MAP_ZOOM_BUTTON_PROPERTIES;
//       search?: MAP_SEARCH_PROPERTIES;
//     }) => void;
//     centerMapOnPoint: (point: number[]) => void;
//     setFollowBlueDot: (
//       enabled: boolean,
//       rotate?: boolean,
//       interval?: number
//     ) => void;
//     setUserPosition: (lat: number, long: number, heading: number) => void;
//     setUserPositionXY: (x: number, y: number, heading: number) => void;
//     clearWayfindingPath: () => void;
//     wayfindToWaypoint: (waypointId: number) => void;
//     wayfindBetweenWaypoints: (originId: number, destinationId: number) => void;
//     drawNavigationPath: (
//       pathId: string,
//       shouldFocus?: boolean,
//       style?: JIBESTREAM_STYLE
//     ) => void;
//     styleUnitsForDestination: (
//       destination: JIBESTREAM_DESTINATION,
//       style?: JIBESTREAM_STYLE
//     ) => void;
//     styleShape: (id: number, style?: JIBESTREAM_STYLE) => void;
//   };
