/*
 * Copyright (C) 2020 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#pragma once

#include "NativeWebWheelEvent.h"
#include <wtf/Deque.h>
#include <wtf/FastMalloc.h>
#include <wtf/WallTime.h>

namespace WebKit {

class WebWheelEventCoalescer {
    WTF_MAKE_FAST_ALLOCATED;
public:
    // If this returns true, use nextEventToDispatch() to get the event to dispatch.
    bool shouldDispatchEvent(const NativeWebWheelEvent&);
    std::optional<WebWheelEvent> nextEventToDispatch();

    NativeWebWheelEvent takeOldestEventBeingProcessed();

    bool hasEventsBeingProcessed() const { return !m_eventsBeingProcessed.isEmpty(); }
    
    bool shouldCoalesceEventsDuringDeceleration() const { return m_shouldCoalesceEventsDuringDeceleration; }
    void setShouldCoalesceEventsDuringDeceleration(bool shouldCoalsce) { m_shouldCoalesceEventsDuringDeceleration = shouldCoalsce; }

    void clear();

private:
    using CoalescedEventSequence = Vector<NativeWebWheelEvent>;

    static bool canCoalesce(const WebWheelEvent&, const WebWheelEvent&);
    static WebWheelEvent coalesce(const WebWheelEvent&, const WebWheelEvent&);

    static bool isMomentumPhaseEvent(const WebWheelEvent&);

    bool shouldDispatchEventNow(const WebWheelEvent&) const;

    Deque<NativeWebWheelEvent, 2> m_wheelEventQueue;
    Deque<std::unique_ptr<CoalescedEventSequence>> m_eventsBeingProcessed;

    WallTime m_lastEventTime;
    WallTime m_lastDispatchedEventTime;
    bool m_shouldCoalesceEventsDuringDeceleration { false };
};

} // namespace WebKit
