// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_INPUT_WEB_COALESCED_INPUT_EVENT_H_
#define THIRD_PARTY_BLINK_PUBLIC_COMMON_INPUT_WEB_COALESCED_INPUT_EVENT_H_

#include <memory>
#include <vector>

#include "third_party/blink/public/common/common_export.h"
#include "third_party/blink/public/common/input/web_input_event.h"
#include "third_party/blink/public/common/input/web_pointer_event.h"
#include "ui/latency/latency_info.h"

namespace blink {

// This class represents a polymorphic WebInputEvent structure with its
// coalesced events. The event could be any event defined in web_input_event.h,
// including those that cannot be coalesced.
class BLINK_COMMON_EXPORT WebCoalescedInputEvent {
 public:
  WebCoalescedInputEvent(const WebInputEvent&, const ui::LatencyInfo&);
  WebCoalescedInputEvent(std::unique_ptr<WebInputEvent>,
                         const ui::LatencyInfo&);
  WebCoalescedInputEvent(std::unique_ptr<WebInputEvent>,
                         std::vector<std::unique_ptr<WebInputEvent>>,
                         std::vector<std::unique_ptr<WebInputEvent>>,
                         const ui::LatencyInfo&);
  // Copy constructor to deep copy the event.
  WebCoalescedInputEvent(const WebCoalescedInputEvent&);
  ~WebCoalescedInputEvent();

  WebInputEvent* EventPointer();
  void AddCoalescedEvent(const blink::WebInputEvent&);
  const WebInputEvent& Event() const;
  size_t CoalescedEventSize() const;
  const WebInputEvent& CoalescedEvent(size_t index) const;
  const std::vector<std::unique_ptr<WebInputEvent>>&
  GetCoalescedEventsPointers() const;

  void AddPredictedEvent(const blink::WebInputEvent&);
  size_t PredictedEventSize() const;
  const WebInputEvent& PredictedEvent(size_t index) const;
  const std::vector<std::unique_ptr<WebInputEvent>>&
  GetPredictedEventsPointers() const;

  const ui::LatencyInfo& latency_info() const { return latency_; }
  ui::LatencyInfo& latency_info() { return latency_; }

  bool CanCoalesceWith(const WebCoalescedInputEvent& other) const
      WARN_UNUSED_RESULT;

  // Coalesce with the |newer_event|. This object will be updated to take into
  // account |newer_event|'s fields.
  void CoalesceWith(const WebCoalescedInputEvent& newer_event);

 private:
  std::unique_ptr<WebInputEvent> event_;
  std::vector<std::unique_ptr<WebInputEvent>> coalesced_events_;
  std::vector<std::unique_ptr<WebInputEvent>> predicted_events_;
  ui::LatencyInfo latency_;
};

}  // namespace blink

#endif
