/*
 *
 *    Copyright (c) 2021 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

#pragma once

#include <platform/CHIPDeviceConfig.h>

#include <glib.h>

#include <ble/Ble.h>
#include <lib/core/CHIPError.h>
#include <platform/GLibTypeDeleter.h>
#include <platform/Linux/dbus/bluez/DbusBluez.h>
#include <system/SystemLayer.h>

#include "BluezObjectManager.h"
#include "Types.h"

namespace chip {
namespace DeviceLayer {
namespace Internal {

/// Receives callbacks when chip devices are being scanned
class ChipDeviceScannerDelegate
{
public:
    virtual ~ChipDeviceScannerDelegate() {}

    // Called when a CHIP device was found
    virtual void OnDeviceScanned(BluezDevice1 & device, const chip::Ble::ChipBLEDeviceIdentificationInfo & info) = 0;

    // Called when a scan was completed (stopped or timed out)
    virtual void OnScanComplete() = 0;

    // Call on scan error
    virtual void OnScanError(CHIP_ERROR) = 0;
};

/// Allows scanning for CHIP devices
///
/// Will perform scan operations and call back whenever a device is discovered.
class ChipDeviceScanner : public BluezObjectManagerAdapterNotificationsDelegate
{
public:
    ChipDeviceScanner(BluezObjectManager & aObjectManager) : mObjectManager(aObjectManager) {}
    ChipDeviceScanner(ChipDeviceScanner &&)                  = default;
    ChipDeviceScanner(const ChipDeviceScanner &)             = delete;
    ChipDeviceScanner & operator=(const ChipDeviceScanner &) = delete;

    ~ChipDeviceScanner() { Shutdown(); }

    /// Initialize the scanner.
    CHIP_ERROR Init(BluezAdapter1 * adapter, ChipDeviceScannerDelegate * delegate);

    /// Release any resources associated with the scanner.
    void Shutdown();

    /// Initiate a scan for devices, with the given timeout
    ///
    /// This method must be called while in the Matter context (from the Matter event
    /// loop, or while holding the Matter stack lock).
    CHIP_ERROR StartScan();

    /// Stop any currently running scan
    CHIP_ERROR StopScan();

    /// Check if the scanner is active
    bool IsScanning() const { return mScannerState == ChipDeviceScannerState::SCANNING; }

    /// Members that implement virtual methods on BluezObjectManagerAdapterNotificationsDelegate
    void OnDeviceAdded(BluezDevice1 & device) override;
    void OnDevicePropertyChanged(BluezDevice1 & device, GVariant * changedProps, const char * const * invalidatedProps) override;
    void OnDeviceRemoved(BluezDevice1 & device) override {}

private:
    enum class ChipDeviceScannerState
    {
        UNINITIALIZED,
        INITIALIZED,
        SCANNING
    };

    CHIP_ERROR StartScanImpl();
    CHIP_ERROR StopScanImpl();

    /// Check if a given device is a CHIP device and if yes, report it as discovered
    void ReportDevice(BluezDevice1 & device);

    /// Check if a given device is a CHIP device and if yes, remove it from the adapter
    /// so that it can be re-discovered if it's still advertising.
    void RemoveDevice(BluezDevice1 & device);

    BluezObjectManager & mObjectManager;
    GAutoPtr<BluezAdapter1> mAdapter;

    ChipDeviceScannerDelegate * mDelegate = nullptr;
    ChipDeviceScannerState mScannerState  = ChipDeviceScannerState::UNINITIALIZED;
    GAutoPtr<GCancellable> mCancellable;
};

} // namespace Internal
} // namespace DeviceLayer
} // namespace chip
