// Copyright (c) Philipp Wagner. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

package de.bytefish.elasticutils.elasticsearch7.example.simulation;

import de.bytefish.elasticutils.elasticsearch7.model.GeoLocation;
import de.bytefish.elasticutils.elasticsearch7.model.LocalWeatherData;
import de.bytefish.elasticutils.elasticsearch7.model.Station;
import de.bytefish.elasticutils.elasticsearch7.utils.DateUtilities;

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public class LocalWeatherDataSimulator {

    private LocalDateTime startDate;
    private LocalDateTime endDate;
    private Duration interval;

    public LocalWeatherDataSimulator(LocalDateTime startDate, LocalDateTime endDate, Duration interval) {
        this.startDate = startDate;
        this.endDate = endDate;
        this.interval = interval;

    public Stream<LocalWeatherData> generate() {

        // Build the Station:
        final Station station = getStation(getGeoLocation());

        // For Creating the Measurement TimeSteps:
        final DateTimeIterator iterator = new DateTimeIterator(startDate, endDate, interval);

        // Create the Stream:
        return StreamSupport
                .stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
                .map(measurementTimeStamp -> createLocalWeatherData(station, measurementTimeStamp));


    private GeoLocation getGeoLocation() {
        final GeoLocation geoLocation = new GeoLocation();

        geoLocation.lat = 41.8705f;
        geoLocation.lon = -103.593f;

        return geoLocation;

    private Station getStation(GeoLocation geoLocation) {
        final Station station = new Station();

        station.wban = "WB1931";
        station.state = "NE";
        station.name = "SCOTTSBLUFF";
        station.location = "WESTERN NE REGIONAL/HEILIG FIELD AP";
        station.geoLocation = geoLocation;

        return station;

    private LocalWeatherData createLocalWeatherData(final Station station, final LocalDateTime measuredTime) {
        final LocalWeatherData data = new LocalWeatherData();

        data.dateTime = DateUtilities.from(measuredTime, ZoneOffset.UTC);
        data.station = station;
        data.skyCondition = "CLR";
        data.temperature = 22.0f;
        data.stationPressure = 42.12f;
        data.windSpeed = 5.0f;

        return data;