/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

#ifndef H_BLE_UUID_
#define H_BLE_UUID_

/**
 * @brief Bluetooth UUID
 * @defgroup bt_uuid Bluetooth UUID
 * @ingroup bt_host
 * @{
 */

#include <inttypes.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

struct os_mbuf;

/** Type of UUID */
enum {
    /** 16-bit UUID (BT SIG assigned) */
    BLE_UUID_TYPE_16 = 16,

    /** 32-bit UUID (BT SIG assigned) */
    BLE_UUID_TYPE_32 = 32,

    /** 128-bit UUID */
    BLE_UUID_TYPE_128 = 128,
};

/** Generic UUID type, to be used only as a pointer */
typedef struct {
    /** Type of the UUID */
    uint8_t type;
} ble_uuid_t;

/** 16-bit UUID */
typedef struct {
    /** Generic UUID structure */
    ble_uuid_t u;

    /** 16-bit UUID value */
    uint16_t value;
} ble_uuid16_t;

/** 32-bit UUID */
typedef struct {
    /** Generic UUID structure */
    ble_uuid_t u;

    /** 32-bit UUID value */
    uint32_t value;
} ble_uuid32_t;

/** 128-bit UUID */
typedef struct {
    /** Generic UUID structure */
    ble_uuid_t u;

    /** 128-bit UUID value  */
    uint8_t value[16];
} ble_uuid128_t;

/** Universal UUID type, to be used for any-UUID static allocation */
typedef union {
    /** Generic UUID structure */
    ble_uuid_t u;

    /** 16-bit UUID structure */
    ble_uuid16_t u16;

    /** 32-bit UUID structure */
    ble_uuid32_t u32;

    /** 128-bit UUID structure */
    ble_uuid128_t u128;
} ble_uuid_any_t;

/**
 * @brief Macro for initializing a 16-bit UUID.
 *
 * This macro initializes a 16-bit UUID with the provided value.
 *
 * @param uuid16    The value of the 16-bit UUID.
 *
 * @return          The initialized 16-bit UUID structure.
 */
#define BLE_UUID16_INIT(uuid16)         \
    {                                   \
        .u = {                          \
            .type = BLE_UUID_TYPE_16,   \
        },                              \
        .value = (uuid16),              \
    }

/**
 * @brief Macro for initializing a 32-bit UUID.
 *
 * This macro initializes a 32-bit UUID with the provided value.
 *
 * @param uuid32    The value of the 32-bit UUID.
 *
 * @return          The initialized 32-bit UUID structure.
 */
#define BLE_UUID32_INIT(uuid32)         \
    {                                   \
        .u = {                          \
            .type = BLE_UUID_TYPE_32,   \
        },                              \
        .value = (uuid32),              \
    }

/**
 * @brief Macro for initializing a 128-bit UUID.
 *
 * This macro initializes a 128-bit UUID with the provided value.
 *
 * @param ...       A sequence of values in little-endian order representing
 *                  the 128-bit UUID.
 *
 * @return          The initialized 128-bit UUID structure.
 */
#define BLE_UUID128_INIT(uuid128 ...)   \
    {                                   \
        .u = {                          \
            .type = BLE_UUID_TYPE_128,  \
        },                              \
        .value = { uuid128 },           \
    }

/**
 * @brief Macro for declaring a pointer to a 16-bit UUID structure initialized
 * with a specific 16-bit UUID value.
 *
 * @param uuid16    The 16-bit UUID value to initialize the structure with.
 *
 * @return          Pointer to a `ble_uuid_t` structure.
 */
#define BLE_UUID16_DECLARE(uuid16) \
    ((ble_uuid_t *) (&(ble_uuid16_t) BLE_UUID16_INIT(uuid16)))

/**
 * @brief Macro for declaring a pointer to a 32-bit UUID structure initialized
 * with a specific 32-bit UUID value.
 *
 * @param uuid32    The 32-bit UUID value to initialize the structure with.
 *
 * @return          Pointer to a `ble_uuid_t` structure.
 */
#define BLE_UUID32_DECLARE(uuid32) \
    ((ble_uuid_t *) (&(ble_uuid32_t) BLE_UUID32_INIT(uuid32)))

/**
 * @brief Macro for declaring a pointer to a 128-bit UUID structure initialized
 * with specific 128-bit UUID values.
 *
 * @param uuid128   The 128-bit UUID value to initialize the structure with.
 *
 * @return          Pointer to a `ble_uuid_t` structure.
 */
#define BLE_UUID128_DECLARE(uuid128...) \
    ((ble_uuid_t *) (&(ble_uuid128_t) BLE_UUID128_INIT(uuid128)))

/**
 * @brief Macro for casting a pointer to a `ble_uuid_t` structure to a pointer
 * to 16-bit UUID structure.
 *
 * @param u         Pointer to a `ble_uuid_t` structure.
 *
 * @return          Pointer to a `ble_uuid16_t` structure.
 */
#define BLE_UUID16(u) \
    ((ble_uuid16_t *) (u))

/**
 * @brief Macro for casting a pointer to a `ble_uuid_t` structure to a pointer
 * to 32-bit UUID structure.
 *
 * @param u         Pointer to a `ble_uuid_t` structure.
 *
 * @return          Pointer to a `ble_uuid32_t` structure.
 */
#define BLE_UUID32(u) \
    ((ble_uuid32_t *) (u))

/**
 * @brief Macro for casting a pointer to a `ble_uuid_t` structure to a pointer
 * to 128-bit UUID structure.
 *
 * @param u         Pointer to a `ble_uuid_t` structure.
 *
 * @return          Pointer to a `ble_uuid128_t` structure.
 */
#define BLE_UUID128(u) \
    ((ble_uuid128_t *) (u))

/** Size of buffer needed to store UUID as a string.
 *  Includes trailing \0.
 */
#define BLE_UUID_STR_LEN (37)

/** @brief Constructs a UUID object from a byte array.
 *
 * @param uuid  On success, this gets populated with the constructed UUID.
 * @param buf   The source buffer to parse.
 * @param len   The size of the buffer, in bytes.
 *
 * @return      0 on success;
 *              BLE_HS_EINVAL if the source buffer does not contain a valid UUID.
 */
int ble_uuid_init_from_buf(ble_uuid_any_t *uuid, const void *buf, size_t len);

/** @brief Compares two Bluetooth UUIDs.
 *
 * @param uuid1  The first UUID to compare.
 * @param uuid2  The second UUID to compare.
 *
 * @return       0 if the two UUIDs are equal;
 *               nonzero if the UUIDs differ.
 */
int ble_uuid_cmp(const ble_uuid_t *uuid1, const ble_uuid_t *uuid2);

/** @brief Copy Bluetooth UUID
 *
 * @param dst    Destination UUID.
 * @param src    Source UUID.
 */
void ble_uuid_copy(ble_uuid_any_t *dst, const ble_uuid_t *src);

/** @brief Converts the specified UUID to its string representation.
 *
 * Example string representations:
 *     o 16-bit:  0x1234
 *     o 32-bit:  0x12345678
 *     o 128-bit: 12345678-1234-1234-1234-123456789abc
 *
 * @param uuid   The source UUID to convert.
 * @param dst    The destination buffer.
 *
 * @return       A pointer to the supplied destination buffer.
 */
char *ble_uuid_to_str(const ble_uuid_t *uuid, char *dst);

/**
 * @brief Converts the specified UUID string to ble_uuid_any_t representation.
 *        If the UUID is recognised as Bluetooth SIG UUID, it will provide its
 *        32-bit or 16-bit representation.
 *
 * Example 128-bit string representations:
 *     o "12345678-1234-1234-1234-123456789abc"
 *     o "12345678123412341234123456789abc"
 *
 * @param uuid  Destination UUID.
 * @param str   The source string UUID.
 *
 * @return      0 on success,
 *              BLE_HS_EINVAL if the specified UUID string has wrong size or
 *              contains disallowed characters.
 */
int
ble_uuid_from_str(ble_uuid_any_t *uuid, const char *str);

/** @brief Converts the specified 16-bit UUID to a uint16_t.
 *
 * @param uuid   The source UUID to convert.
 *
 * @return       The converted integer on success, NULL if the specified UUID is
 *               not 16 bits.
 */
uint16_t ble_uuid_u16(const ble_uuid_t *uuid);

#ifdef __cplusplus
}
#endif

/**
 * @}
 */

#endif /* H_BLE_UUID_ */
