/*
 *
 *    Copyright (c) 2020-2021 Project CHIP Authors
 *    Copyright (c) 2020 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    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.
 */

/**
 *    @file
 *          Provides an implementation of the BLEManager singleton object
 *          for the K32W platforms.
 */

#pragma once

#if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE

#include "Messaging.h"

#include "fsl_os_abstraction.h"

#include "ble_conn_manager.h"
#include "ble_controller_task_config.h"
#include "ble_general.h"
#include "ble_host_task_config.h"
#include "ble_host_tasks.h"
#include "controller_interface.h"
#include "gap_interface.h"
#include "gatt_db_dynamic.h"
#include "gatt_server_interface.h"

#include "FreeRTOS.h"
#include "event_groups.h"
#include "timers.h"

namespace chip {
namespace DeviceLayer {
namespace Internal {

using namespace chip::Ble;

/**
 * Concrete implementation of the BLEManager singleton object for the K32W platforms.
 */
class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePlatformDelegate, private BleApplicationDelegate
{
    // Allow the BLEManager interface class to delegate method calls to
    // the implementation methods provided by this class.
    friend BLEManager;

private:
    // ===== Members that implement the BLEManager internal interface.

    CHIP_ERROR _Init(void);
    void _Shutdown() {}
    bool _IsAdvertisingEnabled(void);
    CHIP_ERROR _SetAdvertisingEnabled(bool val);
    bool _IsAdvertising(void);
    CHIP_ERROR _SetAdvertisingMode(BLEAdvertisingMode mode);
    CHIP_ERROR _GetDeviceName(char * buf, size_t bufSize);
    CHIP_ERROR _SetDeviceName(const char * deviceName);
    uint16_t _NumConnections(void);
    void _OnPlatformEvent(const ChipDeviceEvent * event);
    BleLayer * _GetBleLayer(void);

    // ===== Members that implement virtual methods on BlePlatformDelegate.

    bool SubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, const Ble::ChipBleUUID * svcId,
                                 const Ble::ChipBleUUID * charId) override;
    bool UnsubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, const Ble::ChipBleUUID * svcId,
                                   const Ble::ChipBleUUID * charId) override;
    bool CloseConnection(BLE_CONNECTION_OBJECT conId) override;
    uint16_t GetMTU(BLE_CONNECTION_OBJECT conId) const override;
    bool SendIndication(BLE_CONNECTION_OBJECT conId, const Ble::ChipBleUUID * svcId, const Ble::ChipBleUUID * charId,
                        System::PacketBufferHandle pBuf) override;
    bool SendWriteRequest(BLE_CONNECTION_OBJECT conId, const Ble::ChipBleUUID * svcId, const Ble::ChipBleUUID * charId,
                          System::PacketBufferHandle pBuf) override;
    bool SendReadRequest(BLE_CONNECTION_OBJECT conId, const Ble::ChipBleUUID * svcId, const Ble::ChipBleUUID * charId,
                         System::PacketBufferHandle pBuf) override;
    bool SendReadResponse(BLE_CONNECTION_OBJECT conId, BLE_READ_REQUEST_CONTEXT requestContext, const Ble::ChipBleUUID * svcId,
                          const Ble::ChipBleUUID * charId) override;

    // ===== Members that implement virtual methods on BleApplicationDelegate.

    void NotifyChipConnectionClosed(BLE_CONNECTION_OBJECT conId) override;

    // ===== Members for internal use by the following friends.

    friend BLEManager & BLEMgr(void);
    friend BLEManagerImpl & BLEMgrImpl(void);

    static BLEManagerImpl sInstance;

    // ===== Private members reserved for use by this class only.

    enum class Flags : uint8_t
    {
        kAdvertisingEnabled      = 0x0001,
        kFastAdvertisingEnabled  = 0x0002,
        kAdvertising             = 0x0004,
        kRestartAdvertising      = 0x0008,
        kK32WBLEStackInitialized = 0x0010,
        kDeviceNameSet           = 0x0020,
    };
    BitFlags<BLEManagerImpl::Flags> mFlags;

    enum
    {
        kMaxConnections      = BLE_LAYER_NUM_BLE_ENDPOINTS,
        kMaxDeviceNameLength = 16,
        kUnusedIndex         = 0xFF,
    };

    typedef enum
    {
        BLE_KW_MSG_ERROR = 0x01,
        BLE_KW_MSG_CONNECTED,
        BLE_KW_MSG_DISCONNECTED,
        BLE_KW_MSG_MTU_CHANGED,
        BLE_KW_MSG_ATT_WRITTEN,
        BLE_KW_MSG_ATT_LONG_WRITTEN,
        BLE_KW_MSG_ATT_READ,
        BLE_KW_MSG_ATT_CCCD_WRITTEN,
        BLE_KW_MSG_FORCE_DISCONNECT,
    } blekw_msg_type_t;

    typedef struct hk_ble_kw_msg_s
    {
        blekw_msg_type_t type;
        uint16_t length;
        union
        {
            uint8_t u8;
            uint16_t u16;
            uint32_t u32;
            uint8_t data[1];
            char * str;
        } data;
    } blekw_msg_t;

    typedef enum ble_err_t
    {
        BLE_OK = 0,
        BLE_INTERNAL_GATT_ERROR,
        BLE_E_SET_ADV_PARAMS,
        BLE_E_ADV_PARAMS_FAILED,
        BLE_E_SET_ADV_DATA,
        BLE_E_ADV_CHANGED,
        BLE_E_ADV_FAILED,
        BLE_E_ADV_SETUP_FAILED,
        BLE_E_START_ADV,
        BLE_E_STOP,
        BLE_E_FAIL,
        BLE_E_START_ADV_FAILED,
        BLE_INTERNAL_ERROR,
    } ble_err_t;

    typedef struct ble_att_written_data_s
    {
        uint8_t device_id;
        uint16_t handle;
        uint16_t length;
        uint8_t data[1];
    } blekw_att_written_data_t;

    typedef struct hk_ble_att_read_data_s
    {
        uint8_t device_id;
        uint16_t handle;
    } blekw_att_read_data_t;

    struct CHIPoBLEConState
    {
        uint16_t mtu : 10;
        uint16_t allocated : 1;
        uint16_t subscribed : 1;
        uint16_t unused : 4;
        uint8_t connectionHandle;
        uint8_t bondingHandle;
    };
    CHIPoBLEConState mBleConnections[kMaxConnections];

    CHIPoBLEServiceMode mServiceMode;
    uint16_t mNumGAPCons;
    uint8_t mAdvHandle;
    char mDeviceName[kMaxDeviceNameLength + 1];

    void DriveBLEState(void);
    CHIP_ERROR ConfigureAdvertising(void);
    CHIP_ERROR StartAdvertising(void);
    CHIP_ERROR StopAdvertising(void);
    void HandleSoftDeviceBLEEvent(const ChipDeviceEvent * event);
    void HandleConnectEvent(blekw_msg_t * msg);
    void HandleConnectionCloseEvent(blekw_msg_t * msg);
    void HandleWriteEvent(blekw_msg_t * msg);
    void HandleRXCharWrite(blekw_msg_t * msg);
    void HandleTXCharCCCDWrite(blekw_msg_t * msg);
    CHIP_ERROR HandleGAPConnect(const ChipDeviceEvent * event);
    CHIP_ERROR HandleGAPDisconnect(const ChipDeviceEvent * event);
    CHIP_ERROR HandleRXCharWrite(const ChipDeviceEvent * event);
    CHIP_ERROR HandleTXCharCCCDWrite(const ChipDeviceEvent * event);
    CHIP_ERROR HandleTXComplete(const ChipDeviceEvent * event);
    CHIP_ERROR SetSubscribed(uint16_t conId);
    bool UnsetSubscribed(uint16_t conId);
    bool IsSubscribed(uint16_t conId);
    CHIP_ERROR ConfigureAdvertisingData(void);
    BLEManagerImpl::ble_err_t blekw_send_event(int8_t connection_handle, uint16_t handle, uint8_t * data, uint32_t len);
    bool RemoveConnection(uint8_t connectionHandle);
    void AddConnection(uint8_t connectionHandle);
    BLEManagerImpl::CHIPoBLEConState * GetConnectionState(uint8_t connectionHandle, bool allocate);

    static void DriveBLEState(intptr_t arg);

    static void BLE_SignalFromISRCallback(void);
    static void blekw_connection_timeout_cb(TimerHandle_t timer);
    static CHIP_ERROR blekw_msg_add_u8(blekw_msg_type_t type, uint8_t data);
    static void blekw_new_data_received_notification(uint32_t mask);
    static void BleAdvTimeoutHandler(TimerHandle_t xTimer);
    static void CancelBleAdvTimeoutTimer(void);
    static void StartBleAdvTimeoutTimer(uint32_t aTimeoutInMs);
    static CHIP_ERROR blekw_controller_init(void);
    static CHIP_ERROR blekw_host_init(void);
    static void Host_Task(osaTaskParam_t argument);
    static void blekw_generic_cb(gapGenericEvent_t * pGenericEvent);
    static void blekw_gatt_server_cb(deviceId_t deviceId, gattServerEvent_t * pServerEvent);
    static CHIP_ERROR blekw_msg_add_u16(blekw_msg_type_t type, uint16_t data);
    static CHIP_ERROR blekw_msg_add_att_written(blekw_msg_type_t type, uint8_t device_id, uint16_t handle, uint8_t * data,
                                                uint16_t length);
    static CHIP_ERROR blekw_msg_add_att_read(blekw_msg_type_t type, uint8_t device_id, uint16_t handle);
    static BLEManagerImpl::ble_err_t blekw_start_advertising(gapAdvertisingParameters_t * adv_params, gapAdvertisingData_t * adv,
                                                             gapScanResponseData_t * scnrsp);
    static BLEManagerImpl::ble_err_t blekw_stop_advertising(void);
    static void blekw_gap_advertising_cb(gapAdvertisingEvent_t * pAdvertisingEvent);
    static void blekw_gap_connection_cb(deviceId_t deviceId, gapConnectionEvent_t * pConnectionEvent);
    static void blekw_start_connection_timeout(void);
    static void blekw_stop_connection_timeout(void);

    static void bleAppTask(void * p_arg);

public:
    static bool blekw_stop_connection_internal(BLE_CONNECTION_OBJECT conId);
};

/**
 * Returns a reference to the public interface of the BLEManager singleton object.
 *
 * Internal components should use this to access features of the BLEManager object
 * that are common to all platforms.
 */
inline BLEManager & BLEMgr(void)
{
    return BLEManagerImpl::sInstance;
}

/**
 * Returns the platform-specific implementation of the BLEManager singleton object.
 *
 * Internal components can use this to gain access to features of the BLEManager
 * that are specific to the K32W platforms.
 */
inline BLEManagerImpl & BLEMgrImpl(void)
{
    return BLEManagerImpl::sInstance;
}

inline BleLayer * BLEManagerImpl::_GetBleLayer()
{
    return this;
}

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

#endif // CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
