// 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 SensorProxy_h
#define SensorProxy_h

#include "device/generic_sensor/public/interfaces/sensor.mojom-blink.h"
#include "device/generic_sensor/public/interfaces/sensor_provider.mojom-blink.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "platform/Supplementable.h"
#include "platform/heap/Handle.h"

namespace blink {

class SensorProviderProxy;

// This class wraps 'Sensor' mojo interface and used by multiple
// JS sensor instances of the same type (within a single frame).
class SensorProxy final
    : public GarbageCollectedFinalized<SensorProxy>
    , public device::mojom::blink::SensorClient {
    USING_PRE_FINALIZER(SensorProxy, dispose);
    WTF_MAKE_NONCOPYABLE(SensorProxy);
public:
    class Observer : public GarbageCollectedMixin {
    public:
        // Has valid 'Sensor' binding, {add, remove}Configuration()
        // methods can be called.
        virtual void onSensorInitialized() {}
        // Platfrom sensort reading has changed (for 'ONCHANGE' reporting mode).
        virtual void onSensorReadingChanged() {}
        // An error has occurred.
        virtual void onSensorError() {}
    };

    ~SensorProxy();

    void dispose();

    void addObserver(Observer*);
    void removeObserver(Observer*);

    void initialize();

    bool isInitializing() const { return m_state == Initializing; }
    bool isInitialized() const { return m_state == Initialized; }

    void addConfiguration(device::mojom::blink::SensorConfigurationPtr, std::unique_ptr<Function<void(bool)>>);
    void removeConfiguration(device::mojom::blink::SensorConfigurationPtr, std::unique_ptr<Function<void(bool)>>);

    device::mojom::blink::SensorType type() const { return m_type; }
    device::mojom::blink::ReportingMode reportingMode() const { return m_mode; }

    struct Reading {
        double timestamp;
        double reading[3];
    };
    static_assert(sizeof(Reading) == device::mojom::blink::SensorReadBuffer::kReadBufferSize, "Check reading size");

    const Reading& reading() const { return m_reading; }

    // Updates internal reading from shared buffer.
    void updateInternalReading();

    DECLARE_VIRTUAL_TRACE();

private:
    friend class SensorProviderProxy;
    SensorProxy(device::mojom::blink::SensorType, SensorProviderProxy*);

    // device::mojom::blink::SensorClient overrides.
    void RaiseError() override;
    void SensorReadingChanged() override;

    // Generic handler for a fatal error.
    void handleSensorError();

    void onSensorCreated(device::mojom::blink::SensorReadBufferPtr, device::mojom::blink::SensorClientRequest);

    device::mojom::blink::SensorType m_type;
    device::mojom::blink::ReportingMode m_mode;
    Member<SensorProviderProxy> m_provider;
    using ObserversSet = HeapHashSet<WeakMember<Observer>>;
    ObserversSet m_observers;

    device::mojom::blink::SensorPtr m_sensor;
    mojo::Binding<device::mojom::blink::SensorClient> m_clientBinding;
    enum State {
        Uninitialized,
        Initializing,
        Initialized
    };
    State m_state;
    mojo::ScopedSharedBufferHandle m_sharedBufferHandle;
    mojo::ScopedSharedBufferMapping m_sharedBuffer;
    Reading m_reading;
};

} // namespace blink

#endif // SensorProxy_h
