#ifndef WIFI_OFFLOAD_SERVER_H_
#define WIFI_OFFLOAD_SERVER_H_

#include <android/hardware/wifi/offload/1.0/IOffload.h>

#include "chre_interface_factory.h"

namespace android {
namespace hardware {
namespace wifi {
namespace offload {
namespace V1_0 {
namespace implementation {

class OffloadServer;

class ChreInterfaceCallbacksImpl : public ChreInterfaceCallbacks {
  public:
    ChreInterfaceCallbacksImpl(OffloadServer* server);
    ~ChreInterfaceCallbacksImpl() override;

    void handleConnectionEvents(ChreInterfaceCallbacks::ConnectionEvent event);
    void handleMessage(uint32_t messageType, const std::vector<uint8_t>& message);

  private:
    OffloadServer* mServer;
};

/**
 * Interface object to communicate with Offload HAL
 */
class OffloadServer {
  public:
    OffloadServer(ChreInterfaceFactory* factory);

    OffloadStatus configureScans(const ScanParam& param, const ScanFilter& filter);
    std::pair<OffloadStatus, ScanStats> getScanStats();
    OffloadStatus subscribeScanResults(uint32_t delayMs);
    bool unsubscribeScanResults();
    bool setEventCallback(const sp<IOffloadCallback>& cb);
    void clearEventCallback();

  private:
    void invokeErrorCallbackAndResetIfNeeded(
        const android::hardware::wifi::offload::V1_0::OffloadStatus& status);
    void handleScanResult(const std::vector<uint8_t>& message);
    void handleScanStats(const std::vector<uint8_t>& message);
    void resetNanoApp();

    ScanStats mScanStats;
    std::mutex mScanStatsLock;
    std::condition_variable mScanStatsCond;
    std::mutex mOffloadLock;
    OffloadStatus mScanStatsStatus;

    std::unique_ptr<ChreInterfaceCallbacksImpl> mChreInterfaceCallbacks;
    std::unique_ptr<ChreInterface> mChreInterface;
    sp<IOffloadCallback> mEventCallback;

    friend class ChreInterfaceCallbacksImpl;
};

}  // namespace implementation
}  // namespace V1_0
}  // namespace offload
}  // namespace wifi
}  // namespace hardware
}  // namespace android

#endif  // WIFI_OFFLOAD_SERVER_H_
