/*
 * Copyright 2020 The Android Open Source Project
 *
 * 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 <base/strings/stringprintf.h>
#include <cstdint>

/* BTM application return status codes */
enum : uint8_t {
  BTM_SUCCESS = 0,         /* 0  Command succeeded                 */
  BTM_CMD_STARTED,         /* 1  Command started OK.               */
  BTM_BUSY,                /* 2  Device busy with another command  */
  BTM_NO_RESOURCES,        /* 3  No resources to issue command     */
  BTM_MODE_UNSUPPORTED,    /* 4  Request for 1 or more unsupported modes */
  BTM_ILLEGAL_VALUE,       /* 5  Illegal parameter value           */
  BTM_WRONG_MODE,          /* 6  Device in wrong mode for request  */
  BTM_UNKNOWN_ADDR,        /* 7  Unknown remote BD address         */
  BTM_DEVICE_TIMEOUT,      /* 8  Device timeout                    */
  BTM_BAD_VALUE_RET,       /* 9  A bad value was received from HCI */
  BTM_ERR_PROCESSING,      /* 10 Generic error                     */
  BTM_NOT_AUTHORIZED,      /* 11 Authorization failed              */
  BTM_DEV_RESET,           /* 12 Device has been reset             */
  BTM_CMD_STORED,          /* 13 request is stored in control block */
  BTM_ILLEGAL_ACTION,      /* 14 state machine gets illegal command */
  BTM_DELAY_CHECK,         /* 15 delay the check on encryption */
  BTM_SCO_BAD_LENGTH,      /* 16 Bad SCO over HCI data length */
  BTM_SUCCESS_NO_SECURITY, /* 17 security passed, no security set  */
  BTM_FAILED_ON_SECURITY,  /* 18 security failed                   */
  BTM_REPEATED_ATTEMPTS,   /* 19 repeated attempts for LE security requests */
  BTM_MODE4_LEVEL4_NOT_SUPPORTED, /* 20 Secure Connections Only Mode can't be
                                     supported */
  BTM_DEV_RESTRICT_LISTED,        /* 21 The device is restrict listed */
  BTM_MAX_STATUS_VALUE = BTM_DEV_RESTRICT_LISTED,
  BTM_UNDEFINED = 0xFF,
};
typedef uint8_t tBTM_STATUS;

inline uint8_t btm_status_value(const tBTM_STATUS& status) {
  return static_cast<uint8_t>(status);
}

inline tBTM_STATUS to_btm_status(const uint8_t& value) {
  if (value > BTM_MAX_STATUS_VALUE) return BTM_UNDEFINED;
  return static_cast<tBTM_STATUS>(value);
}

#define CASE_RETURN_TEXT(code) \
  case code:                   \
    return #code

inline std::string btm_status_text(const tBTM_STATUS& status) {
  switch (status) {
    CASE_RETURN_TEXT(BTM_SUCCESS);
    CASE_RETURN_TEXT(BTM_CMD_STARTED);
    CASE_RETURN_TEXT(BTM_BUSY);
    CASE_RETURN_TEXT(BTM_NO_RESOURCES);
    CASE_RETURN_TEXT(BTM_MODE_UNSUPPORTED);
    CASE_RETURN_TEXT(BTM_ILLEGAL_VALUE);
    CASE_RETURN_TEXT(BTM_WRONG_MODE);
    CASE_RETURN_TEXT(BTM_UNKNOWN_ADDR);
    CASE_RETURN_TEXT(BTM_DEVICE_TIMEOUT);
    CASE_RETURN_TEXT(BTM_BAD_VALUE_RET);
    CASE_RETURN_TEXT(BTM_ERR_PROCESSING);
    CASE_RETURN_TEXT(BTM_NOT_AUTHORIZED);
    CASE_RETURN_TEXT(BTM_DEV_RESET);
    CASE_RETURN_TEXT(BTM_CMD_STORED);
    CASE_RETURN_TEXT(BTM_ILLEGAL_ACTION);
    CASE_RETURN_TEXT(BTM_DELAY_CHECK);
    CASE_RETURN_TEXT(BTM_SCO_BAD_LENGTH);
    CASE_RETURN_TEXT(BTM_SUCCESS_NO_SECURITY);
    CASE_RETURN_TEXT(BTM_FAILED_ON_SECURITY);
    CASE_RETURN_TEXT(BTM_REPEATED_ATTEMPTS);
    CASE_RETURN_TEXT(BTM_MODE4_LEVEL4_NOT_SUPPORTED);
    CASE_RETURN_TEXT(BTM_DEV_RESTRICT_LISTED);
    default:
      return std::string("UNKNOWN[%hhu]", status);
  }
}

#undef CASE_RETURN_TEXT
