// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#pragma once

#include <string.h>

#include <ddk/protocol/bt/gattsvc.h>
#include <zircon/compiler.h>
#include <zircon/types.h>

__BEGIN_CDECLS;

// BT SIG Base UUID for all 16/32 assigned UUID values.
//
//    "00000000-0000-1000-8000-00805F9B34FB"
//
// (see Core Spec v5.0, Vol 3, Part B, Section 2.5.1)
#define BT_GATT_BASE_UUID                                                       \
    {                                                                           \
        0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, \
            0x00, 0x00, 0x00, 0x00                                              \
    }

#define __BT_UUID_ASSIGNED_OFFSET 12

// Convenience function to make a UUID from a 32-bit assigned value.
static inline bt_gatt_uuid_t bt_gatt_make_uuid32(uint32_t value) {
    bt_gatt_uuid_t retval = {.bytes = BT_GATT_BASE_UUID};

    retval.bytes[__BT_UUID_ASSIGNED_OFFSET] = (uint8_t)(value);
    retval.bytes[__BT_UUID_ASSIGNED_OFFSET + 1] = (uint8_t)(value >> 8);
    retval.bytes[__BT_UUID_ASSIGNED_OFFSET + 2] = (uint8_t)(value >> 16);
    retval.bytes[__BT_UUID_ASSIGNED_OFFSET + 3] = (uint8_t)(value >> 24);

    return retval;
}

// Convenience function to make a UUID from a 16-bit assigned value.
static inline bt_gatt_uuid_t bt_gatt_make_uuid16(uint16_t value) {
    return bt_gatt_make_uuid32((uint32_t)value);
}
// UUID comparsion.
// Note: this method only does a binary comparsion and doesn't break out low,
// mid, high, version, sequence, or node parts for indiviual comparison so
// doesn't conform to standard UUID sort.
static inline int bt_gatt_compare_uuid(const bt_gatt_uuid_t* u1,
                                       const bt_gatt_uuid_t* u2) {
    return memcmp(u1->bytes, u2->bytes, 16);
}

__END_CDECLS;
