
import {
    MOCK_LOCATION_GPX_PLAYBACK_SPEED,
    MOCK_LOCATION_UPDATE_INTERVAL,
    MOCK_LOCATION_USE_GPX,
    MOCK_LOCATION_LAT_MIN, MOCK_LOCATION_LAT_MAX,
    MOCK_LOCATION_LNG_MIN, MOCK_LOCATION_LNG_MAX,
} from '@/constants';

let mockGPX = [];
if (process.env.NODE_ENV !== 'production') {
    // Use a node_modules require here, this is handled by Webpack to fetch either
    // a custom mock_gpx.json or a default empty one.
    mockGPX = require('mock_gpx.json'); // eslint-disable-line global-require
}

export function mockLocationRandom() {
    let heading = null;
    if (Math.random() > 0.25) {
        heading = Math.random() * 360;
    }
    let speed = null;
    if (Math.random() > 0.25) {
        speed = Math.random() * 9; // in meters/s
    }
    const newLocation = {
        coords: {
            accuracy: Math.random() * 100, // In meters
            latitude: (
                (Math.random() * (MOCK_LOCATION_LAT_MAX - MOCK_LOCATION_LAT_MIN))
                + MOCK_LOCATION_LAT_MIN
            ),
            longitude: (
                (Math.random() * (MOCK_LOCATION_LNG_MAX - MOCK_LOCATION_LNG_MIN))
                + MOCK_LOCATION_LNG_MIN
            ),
            heading,
            speed,
        },
        timestamp: new Date().getTime(),
    };
    console.log('New mock location: ', newLocation);
    return newLocation;
}

export function mockLocationWithGPX(index, setPosition) {
    if (mockGPX[index]) {
        setPosition(mockGPX[index]);
        if (mockGPX[index + 1]) {
            const delay = (
                Date.parse(mockGPX[index + 1].time)
                - Date.parse(mockGPX[index].time)
            );
            setTimeout(
                () => mockLocationWithGPX(index + 1, setPosition),
                delay / MOCK_LOCATION_GPX_PLAYBACK_SPEED,
            );
        }
    }
}

export function mockLocation(setPosition) {
    if (MOCK_LOCATION_USE_GPX) {
        mockLocationWithGPX(0, setPosition);
        return -1; // Return a fake setInterval id
    }
    setPosition(mockLocationRandom());
    return setInterval(
        () => setPosition(mockLocationRandom()),
        MOCK_LOCATION_UPDATE_INTERVAL,
    );
}

export function capitalize(string) {
    return string.charAt(0).toUpperCase() + string.slice(1);
}
