import { number, func, shape, string, oneOfType, oneOf, bool, object, arrayOf } from 'prop-types';

export const LatLngPropType = shape({
    latitude: number.isRequired,
    longitude: number.isRequired,
});

export const NaviLatLngPropType = shape({
    latitude: number.isRequired,
    longitude: number.isRequired,
});

export const NaviPoiPropType = shape({
    name: string.isRequired,
    coordinate: LatLngPropType.isRequired,
    poiId: string.isRequired,
    direction: number,
});

export const DriveNaviPointPropType = oneOfType([
    string.isRequired,
    NaviLatLngPropType.isRequired,
    NaviPoiPropType.isRequired,
    arrayOf(string),
    arrayOf(NaviLatLngPropType),
    arrayOf(NaviPoiPropType),
]);

export const RideNaviPointPropType = oneOfType([NaviLatLngPropType.isRequired, NaviPoiPropType.isRequired]);

export const WalkNaviPointPropType = oneOfType([
    NaviLatLngPropType.isRequired,
    NaviPoiPropType.isRequired,
    arrayOf(NaviLatLngPropType).isRequired,
]);

export const NaviShowModePropType = oneOf([1, 2, 3]);

export const NaviTrackingModePropType = oneOf([0, 1]);

export const RegionPropType = shape({
    latitude: number.isRequired,
    longitude: number.isRequired,
    latitudeDelta: number.isRequired,
    longitudeDelta: number.isRequired,
});

export const PointPropType = shape({
    x: number.isRequired,
    y: number.isRequired,
});

export const LocationStylePropType = shape({
    image: oneOfType([object, number]),
    fillColor: string,
    strokeColor: string,
    strokeWidth: number,
    locationDotBgColor: string,
    locationDotFillColor: string,
    enablePulseAnnimation: bool,
    showsHeadingIndicator: bool,
    showsAccuracyRing: bool,
});

export const mapEventsPropType = (events: string[]) =>
    events.reduce((props: { [key: string]: Function }, event) => {
        props[event.replace(/^on/, 'onAMap')] = func;
        return props;
    }, {});
