public GameweekTimeline(GameweekTimeline prev, List <TimelineLiveElement> le)
 {
     liveElements = le;
     if (prev != null)
     {
         timeline = prev.timeline;
     }
 }
    public async Task Process()
    {
        var bs = await _client.getBootstrapStatic();

        var currEvent   = bs.events.FirstOrDefault(ev => ev.is_current);
        var gw          = currEvent.id;
        var currentLive = await _client.getLiveData(gw);

        var previousTimeline = await ReadPreviousTimeline(gw);

        var newTimeline = new GameweekTimeline(previousTimeline, currentLive.elements.Select(el => new TimelineLiveElement(el)).ToList());

        // Find and log differences between previous timeline and current live
        var diffs     = FindAllPlayerDifferences(previousTimeline, currentLive);
        var timestamp = DateTime.Now;

        var prediction = new List <TimelineLiveElement>();
        var predictor  = new TimelinePredictor(gw, _client);
        await predictor.Init();

        foreach (var element in bs.elements)
        {
            var liveElementBase = currentLive.elements.FirstOrDefault(e => e.id == element.id);
            var liveElement     = liveElementBase != null ? new TimelineLiveElement(liveElementBase) : new TimelineLiveElement()
            {
                id = element.id
            };
            prediction.Add(await predictor.Predict(liveElement));
        }
        newTimeline.prediction = prediction;
        var predictionDiff = FindAllPlayerPredictionDifferences(previousTimeline != null ? previousTimeline.prediction : new List <TimelineLiveElement>(), newTimeline.prediction);

        Console.WriteLine($"Diffs: {diffs.Count}");
        Console.WriteLine($"PredictionDiffs: {predictionDiff.Count}");
        if (diffs.Count > 0 || predictionDiff.Count > 0)
        {
            newTimeline.timeline.Add(new GameweekTimelineEntry()
            {
                timestamp      = timestamp,
                diff           = diffs,
                predictionDiff = predictionDiff
            });
            await WriteTimeline(gw, newTimeline);
        }
    }
    private List <TimelineLiveElement> FindAllPlayerDifferences(GameweekTimeline prev, Live currLive)
    {
        var diffs = new List <TimelineLiveElement>();

        foreach (LiveElementBase currLiveElement in currLive.elements)
        {
            var elementId  = currLiveElement.id;
            var comparison = currLiveElement;
            if (prev != null)
            {
                var prevLiveElement = prev.liveElements.FirstOrDefault(p => p.id == elementId);
                comparison = Compare(prevLiveElement, currLiveElement);
            }
            else
            {
                comparison = getBaseDiff(currLiveElement);
            }
            if (comparison != null)
            {
                diffs.Add(new TimelineLiveElement(currLiveElement));
            }
        }
        return(diffs);
    }
 private async Task WriteTimeline(int gw, GameweekTimeline timeline)
 {
     await _writer.write(GetS3Key(gw), timeline, true);
 }