// Copyright 2017-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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
 *  @brief Bluetooth Mesh Light Client Model APIs.
 */

#ifndef _ESP_BLE_MESH_LIGHTING_MODEL_API_H_
#define _ESP_BLE_MESH_LIGHTING_MODEL_API_H_

#include "esp_ble_mesh_defs.h"

#ifdef __cplusplus
extern "C" {
#endif

/** @def    ESP_BLE_MESH_MODEL_LIGHT_LIGHTNESS_CLI
 *
 *  @brief  Define a new Light Lightness Client Model.
 *
 *  @note   This API needs to be called for each element on which
 *          the application needs to have a Light Lightness Client Model.
 *
 *  @param  cli_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  cli_data Pointer to the unique struct esp_ble_mesh_client_t.
 *
 *  @return New Light Lightness Client Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_LIGHTNESS_CLI(cli_pub, cli_data)           \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_LIGHTNESS_CLI,   \
                    NULL, cli_pub, cli_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_CTL_CLI
 *
 *  @brief  Define a new Light CTL Client Model.
 *
 *  @note   This API needs to be called for each element on which
 *          the application needs to have a Light CTL Client Model.
 *
 *  @param  cli_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  cli_data Pointer to the unique struct esp_ble_mesh_client_t.
 *
 *  @return New Light CTL Client Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_CTL_CLI(cli_pub, cli_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_CTL_CLI,     \
                    NULL, cli_pub, cli_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_HSL_CLI
 *
 *  @brief  Define a new Light HSL Client Model.
 *
 *  @note   This API needs to be called for each element on which
 *          the application needs to have a Light HSL Client Model.
 *
 *  @param  cli_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  cli_data Pointer to the unique struct esp_ble_mesh_client_t.
 *
 *  @return New Light HSL Client Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_HSL_CLI(cli_pub, cli_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_HSL_CLI,     \
                    NULL, cli_pub, cli_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_XYL_CLI
 *
 *  @brief  Define a new Light xyL Client Model.
 *
 *  @note   This API needs to be called for each element on which
 *          the application needs to have a Light xyL Client Model.
 *
 *  @param  cli_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  cli_data Pointer to the unique struct esp_ble_mesh_client_t.
 *
 *  @return New Light xyL Client Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_XYL_CLI(cli_pub, cli_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_XYL_CLI,     \
                    NULL, cli_pub, cli_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_LC_CLI
 *
 *  @brief  Define a new Light LC Client Model.
 *
 *  @note   This API needs to be called for each element on which
 *          the application needs to have a Light LC Client Model.
 *
 *  @param  cli_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  cli_data Pointer to the unique struct esp_ble_mesh_client_t.
 *
 *  @return New Light LC Client Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_LC_CLI(cli_pub, cli_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_LC_CLI,     \
                    NULL, cli_pub, cli_data)

/**
 *  @brief Bluetooth Mesh Light Lightness Client Model Get and Set parameters structure.
 */

/** Parameters of Light Lightness Set */
typedef struct {
    bool     op_en;        /*!< Indicate if optional parameters are included */
    uint16_t lightness;    /*!< Target value of light lightness actual state */
    uint8_t  tid;          /*!< Transaction ID */
    uint8_t  trans_time;   /*!< Time to complete state transition (optional) */
    uint8_t  delay;        /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_light_lightness_set_t;

/** Parameters of Light Lightness Linear Set */
typedef struct {
    bool     op_en;        /*!< Indicate if optional parameters are included */
    uint16_t lightness;    /*!< Target value of light lightness linear state */
    uint8_t  tid;          /*!< Transaction ID */
    uint8_t  trans_time;   /*!< Time to complete state transition (optional) */
    uint8_t  delay;        /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_light_lightness_linear_set_t;

/** Parameter of Light Lightness Default Set */
typedef struct {
    uint16_t lightness;    /*!< The value of the Light Lightness Default state */
} esp_ble_mesh_light_lightness_default_set_t;

/** Parameters of Light Lightness Range Set */
typedef struct {
    uint16_t range_min;    /*!< Value of range min field of light lightness range state */
    uint16_t range_max;    /*!< Value of range max field of light lightness range state */
} esp_ble_mesh_light_lightness_range_set_t;

/** Parameters of Light CTL Set */
typedef struct {
    bool     op_en;            /*!< Indicate if optional parameters are included */
    uint16_t ctl_lightness;    /*!< Target value of light ctl lightness state */
    uint16_t ctl_temperatrue;  /*!< Target value of light ctl temperature state */
    int16_t  ctl_delta_uv;     /*!< Target value of light ctl delta UV state */
    uint8_t  tid;              /*!< Transaction ID */
    uint8_t  trans_time;       /*!< Time to complete state transition (optional) */
    uint8_t  delay;            /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_light_ctl_set_t;

/** Parameters of Light CTL Temperature Set */
typedef struct {
    bool     op_en;            /*!< Indicate if optional parameters are included */
    uint16_t ctl_temperatrue;  /*!< Target value of light ctl temperature state */
    int16_t  ctl_delta_uv;     /*!< Target value of light ctl delta UV state */
    uint8_t  tid;              /*!< Transaction ID */
    uint8_t  trans_time;       /*!< Time to complete state transition (optional) */
    uint8_t  delay;            /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_light_ctl_temperature_set_t;

/** Parameters of Light CTL Temperature Range Set */
typedef struct {
    uint16_t range_min;        /*!< Value of temperature range min field of light ctl temperature range state */
    uint16_t range_max;        /*!< Value of temperature range max field of light ctl temperature range state */
} esp_ble_mesh_light_ctl_temperature_range_set_t;

/** Parameters of Light CTL Default Set */
typedef struct {
    uint16_t lightness;        /*!< Value of light lightness default state */
    uint16_t temperature;      /*!< Value of light temperature default state */
    int16_t  delta_uv;         /*!< Value of light delta UV default state */
} esp_ble_mesh_light_ctl_default_set_t;

/** Parameters of Light HSL Set */
typedef struct {
    bool     op_en;            /*!< Indicate if optional parameters are included */
    uint16_t hsl_lightness;    /*!< Target value of light hsl lightness state */
    uint16_t hsl_hue;          /*!< Target value of light hsl hue state */
    uint16_t hsl_saturation;   /*!< Target value of light hsl saturation state */
    uint8_t  tid;              /*!< Transaction ID */
    uint8_t  trans_time;       /*!< Time to complete state transition (optional) */
    uint8_t  delay;            /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_light_hsl_set_t;

/** Parameters of Light HSL Hue Set */
typedef struct {
    bool     op_en;            /*!< Indicate if optional parameters are included */
    uint16_t hue;              /*!< Target value of light hsl hue state */
    uint8_t  tid;              /*!< Transaction ID */
    uint8_t  trans_time;       /*!< Time to complete state transition (optional) */
    uint8_t  delay;            /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_light_hsl_hue_set_t;

/** Parameters of Light HSL Saturation Set */
typedef struct {
    bool     op_en;            /*!< Indicate if optional parameters are included */
    uint16_t saturation;       /*!< Target value of light hsl hue state */
    uint8_t  tid;              /*!< Transaction ID */
    uint8_t  trans_time;       /*!< Time to complete state transition (optional) */
    uint8_t  delay;            /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_light_hsl_saturation_set_t;

/** Parameters of Light HSL Default Set */
typedef struct {
    uint16_t lightness;        /*!< Value of light lightness default state */
    uint16_t hue;              /*!< Value of light hue default state */
    uint16_t saturation;       /*!< Value of light saturation default state */
} esp_ble_mesh_light_hsl_default_set_t;

/** Parameters of Light HSL Range Set */
typedef struct {
    uint16_t hue_range_min;        /*!< Value of hue range min field of light hsl hue range state */
    uint16_t hue_range_max;        /*!< Value of hue range max field of light hsl hue range state */
    uint16_t saturation_range_min; /*!< Value of saturation range min field of light hsl saturation range state */
    uint16_t saturation_range_max; /*!< Value of saturation range max field of light hsl saturation range state */
} esp_ble_mesh_light_hsl_range_set_t;

/** Parameters of Light xyL Set */
typedef struct {
    bool     op_en;            /*!< Indicate whether optional parameters included */
    uint16_t xyl_lightness;    /*!< The target value of the Light xyL Lightness state */
    uint16_t xyl_x;            /*!< The target value of the Light xyL x state */
    uint16_t xyl_y;            /*!< The target value of the Light xyL y state */
    uint8_t  tid;              /*!< Transaction Identifier */
    uint8_t  trans_time;       /*!< Time to complete state transition (optional) */
    uint8_t  delay;            /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_light_xyl_set_t;

/** Parameters of Light xyL Default Set */
typedef struct {
    uint16_t lightness;        /*!< The value of the Light Lightness Default state */
    uint16_t xyl_x;            /*!< The value of the Light xyL x Default state */
    uint16_t xyl_y;            /*!< The value of the Light xyL y Default state */
} esp_ble_mesh_light_xyl_default_set_t;

/** Parameters of Light xyL Range Set */
typedef struct {
    uint16_t xyl_x_range_min;  /*!< The value of the xyL x Range Min field of the Light xyL x Range state */
    uint16_t xyl_x_range_max;  /*!< The value of the xyL x Range Max field of the Light xyL x Range state */
    uint16_t xyl_y_range_min;  /*!< The value of the xyL y Range Min field of the Light xyL y Range state */
    uint16_t xyl_y_range_max;  /*!< The value of the xyL y Range Max field of the Light xyL y Range state */
} esp_ble_mesh_light_xyl_range_set_t;

/** Parameter of Light LC Mode Set */
typedef struct {
    uint8_t mode;              /*!< The target value of the Light LC Mode state */
} esp_ble_mesh_light_lc_mode_set_t;

/** Parameter of Light LC OM Set */
typedef struct {
    uint8_t mode;              /*!< The target value of the Light LC Occupancy Mode state */
} esp_ble_mesh_light_lc_om_set_t;

/** Parameters of Light LC Light OnOff Set */
typedef struct {
    bool    op_en;             /*!< Indicate whether optional parameters included */
    uint8_t light_onoff;       /*!< The target value of the Light LC Light OnOff state */
    uint8_t tid;               /*!< Transaction Identifier */
    uint8_t trans_time;        /*!< Time to complete state transition (optional) */
    uint8_t delay;             /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_light_lc_light_onoff_set_t;

/** Parameter of Light LC Property Get */
typedef struct {
    uint16_t property_id;      /*!< Property ID identifying a Light LC Property */
} esp_ble_mesh_light_lc_property_get_t;

/** Parameters of Light LC Property Set */
typedef struct {
    uint16_t property_id;      /*!< Property ID identifying a Light LC Property */
    struct net_buf_simple *property_value;  /*!< Raw value for the Light LC Property */
} esp_ble_mesh_light_lc_property_set_t;

/**
 * @brief Lighting Client Model get message union
 */
typedef union {
    esp_ble_mesh_light_lc_property_get_t           lc_property_get;             /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LC_PROPERTY_GET */
} esp_ble_mesh_light_client_get_state_t;

/**
 * @brief Lighting Client Model set message union
 */
typedef union {
    esp_ble_mesh_light_lightness_set_t             lightness_set;               /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_SET_UNACK */
    esp_ble_mesh_light_lightness_linear_set_t      lightness_linear_set;        /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_LINEAR_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_LINEAR_SET_UNACK */
    esp_ble_mesh_light_lightness_default_set_t     lightness_default_set;       /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_DEFAULT_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_DEFAULT_SET_UNACK */
    esp_ble_mesh_light_lightness_range_set_t       lightness_range_set;         /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_RANGE_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_RANGE_SET_UNACK */
    esp_ble_mesh_light_ctl_set_t                   ctl_set;                     /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_CTL_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_CTL_SET_UNACK */
    esp_ble_mesh_light_ctl_temperature_set_t       ctl_temperature_set;         /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_CTL_TEMPERATURE_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_CTL_TEMPERATURE_SET_UNACK */
    esp_ble_mesh_light_ctl_temperature_range_set_t ctl_temperature_range_set;   /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_CTL_TEMPERATURE_RANGE_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK */
    esp_ble_mesh_light_ctl_default_set_t           ctl_default_set;             /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_CTL_DEFAULT_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_CTL_DEFAULT_SET_UNACK */
    esp_ble_mesh_light_hsl_set_t                   hsl_set;                     /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_SET_UNACK */
    esp_ble_mesh_light_hsl_hue_set_t               hsl_hue_set;                 /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_HUE_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_HUE_SET_UNACK */
    esp_ble_mesh_light_hsl_saturation_set_t        hsl_saturation_set;          /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_SATURATION_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_SATURATION_SET_UNACK */
    esp_ble_mesh_light_hsl_default_set_t           hsl_default_set;             /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_DEFAULT_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_DEFAULT_SET_UNACK */
    esp_ble_mesh_light_hsl_range_set_t             hsl_range_set;               /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_RANGE_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_RANGE_SET_UNACK */
    esp_ble_mesh_light_xyl_set_t                   xyl_set;                     /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_XYL_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_XYL_SET_UNACK */
    esp_ble_mesh_light_xyl_default_set_t           xyl_default_set;             /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_XYL_DEFAULT_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_XYL_DEFAULT_SET_UNACK */
    esp_ble_mesh_light_xyl_range_set_t             xyl_range_set;               /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_XYL_RANGE_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_XYL_RANGE_SET_UNACK */
    esp_ble_mesh_light_lc_mode_set_t               lc_mode_set;                 /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LC_MODE_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_LC_MODE_SET_UNACK */
    esp_ble_mesh_light_lc_om_set_t                 lc_om_set;                   /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LC_OM_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_LC_OM_SET_UNACK */
    esp_ble_mesh_light_lc_light_onoff_set_t        lc_light_onoff_set;          /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LC_LIGHT_ONOFF_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_LC_LIGHT_ONOFF_SET_UNACK */
    esp_ble_mesh_light_lc_property_set_t           lc_property_set;             /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LC_PROPERTY_SET & ESP_BLE_MESH_MODEL_OP_LIGHT_LC_PROPERTY_SET_UNACK */
} esp_ble_mesh_light_client_set_state_t;

/**
 *  @brief Bluetooth Mesh Light Lightness Client Model Get and Set callback parameters structure.
 */

/** Parameters of Light Lightness Status */
typedef struct {
    bool     op_en;                /*!< Indicate if optional parameters are included */
    uint16_t present_lightness;    /*!< Current value of light lightness actual state */
    uint16_t target_lightness;     /*!< Target value of light lightness actual state (optional) */
    uint8_t  remain_time;          /*!< Time to complete state transition (C.1) */
} esp_ble_mesh_light_lightness_status_cb_t;

/** Parameters of Light Lightness Linear Status */
typedef struct {
    bool     op_en;                /*!< Indicate if optional parameters are included */
    uint16_t present_lightness;    /*!< Current value of light lightness linear state */
    uint16_t target_lightness;     /*!< Target value of light lightness linear state (optional) */
    uint8_t  remain_time;          /*!< Time to complete state transition (C.1) */
} esp_ble_mesh_light_lightness_linear_status_cb_t;

/** Parameter of Light Lightness Last Status */
typedef struct {
    uint16_t lightness;            /*!< The value of the Light Lightness Last state */
} esp_ble_mesh_light_lightness_last_status_cb_t;

/** Parameter of Light Lightness Default Status */
typedef struct {
    uint16_t lightness;            /*!< The value of the Light Lightness default State */
} esp_ble_mesh_light_lightness_default_status_cb_t;

/** Parameters of Light Lightness Range Status */
typedef struct {
    uint8_t  status_code;          /*!< Status Code for the request message */
    uint16_t range_min;            /*!< Value of range min field of light lightness range state */
    uint16_t range_max;            /*!< Value of range max field of light lightness range state */
} esp_ble_mesh_light_lightness_range_status_cb_t;

/** Parameters of Light CTL Status */
typedef struct {
    bool     op_en;                    /*!< Indicate if optional parameters are included */
    uint16_t present_ctl_lightness;    /*!< Current value of light ctl lightness state */
    uint16_t present_ctl_temperature;  /*!< Current value of light ctl temperature state */
    uint16_t target_ctl_lightness;     /*!< Target value of light ctl lightness state (optional) */
    uint16_t target_ctl_temperature;   /*!< Target value of light ctl temperature state (C.1) */
    uint8_t  remain_time;              /*!< Time to complete state transition (C.1) */
} esp_ble_mesh_light_ctl_status_cb_t;

/** Parameters of Light CTL Temperature Status */
typedef struct {
    bool     op_en;                    /*!< Indicate if optional parameters are included */
    uint16_t present_ctl_temperature;  /*!< Current value of light ctl temperature state */
    uint16_t present_ctl_delta_uv;     /*!< Current value of light ctl delta UV state */
    uint16_t target_ctl_temperature;   /*!< Target value of light ctl temperature state (optional) */
    uint16_t target_ctl_delta_uv;      /*!< Target value of light ctl delta UV state (C.1) */
    uint8_t  remain_time;              /*!< Time to complete state transition (C.1) */
} esp_ble_mesh_light_ctl_temperature_status_cb_t;

/** Parameters of Light CTL Temperature Range Status */
typedef struct {
    uint8_t  status_code;      /*!< Status code for the request message */
    uint16_t range_min;        /*!< Value of temperature range min field of light ctl temperature range state */
    uint16_t range_max;        /*!< Value of temperature range max field of light ctl temperature range state */
} esp_ble_mesh_light_ctl_temperature_range_status_cb_t;

/** Parameters of Light CTL Default Status */
typedef struct {
    uint16_t lightness;        /*!< Value of light lightness default state */
    uint16_t temperature;      /*!< Value of light temperature default state */
    int16_t  delta_uv;         /*!< Value of light delta UV default state */
} esp_ble_mesh_light_ctl_default_status_cb_t;

/** Parameters of Light HSL Status */
typedef struct {
    bool     op_en;            /*!< Indicate if optional parameters are included */
    uint16_t hsl_lightness;    /*!< Current value of light hsl lightness state */
    uint16_t hsl_hue;          /*!< Current value of light hsl hue state */
    uint16_t hsl_saturation;   /*!< Current value of light hsl saturation state */
    uint8_t  remain_time;      /*!< Time to complete state transition (optional) */
} esp_ble_mesh_light_hsl_status_cb_t;

/** Parameters of Light HSL Target Status */
typedef struct {
    bool  op_en;                    /*!< Indicate if optional parameters are included */
    uint16_t hsl_lightness_target;     /*!< Target value of light hsl lightness state */
    uint16_t hsl_hue_target;           /*!< Target value of light hsl hue state */
    uint16_t hsl_saturation_target;    /*!< Target value of light hsl saturation state */
    uint8_t  remain_time;              /*!< Time to complete state transition (optional) */
} esp_ble_mesh_light_hsl_target_status_cb_t;

/** Parameters of Light HSL Hue Status */
typedef struct {
    bool     op_en;        /*!< Indicate if optional parameters are included */
    uint16_t present_hue;  /*!< Current value of light hsl hue state */
    uint16_t target_hue;   /*!< Target value of light hsl hue state (optional) */
    uint8_t  remain_time;  /*!< Time to complete state transition (C.1) */
} esp_ble_mesh_light_hsl_hue_status_cb_t;

/** Parameters of Light HSL Saturation Status */
typedef struct {
    bool     op_en;                /*!< Indicate if optional parameters are included */
    uint16_t present_saturation;   /*!< Current value of light hsl saturation state */
    uint16_t target_saturation;    /*!< Target value of light hsl saturation state (optional) */
    uint8_t  remain_time;          /*!< Time to complete state transition (C.1) */
} esp_ble_mesh_light_hsl_saturation_status_cb_t;

/** Parameters of Light HSL Default Status */
typedef struct {
    uint16_t lightness;    /*!< Value of light lightness default state */
    uint16_t hue;          /*!< Value of light hue default state */
    uint16_t saturation;   /*!< Value of light saturation default state */
} esp_ble_mesh_light_hsl_default_status_cb_t;

/** Parameters of Light HSL Range Status */
typedef struct {
    uint8_t  status_code;          /*!< Status code for the request message */
    uint16_t hue_range_min;        /*!< Value of hue range min field of light hsl hue range state */
    uint16_t hue_range_max;        /*!< Value of hue range max field of light hsl hue range state */
    uint16_t saturation_range_min; /*!< Value of saturation range min field of light hsl saturation range state */
    uint16_t saturation_range_max; /*!< Value of saturation range max field of light hsl saturation range state */
} esp_ble_mesh_light_hsl_range_status_cb_t;

/** Parameters of Light xyL Status */
typedef struct {
    bool     op_en;                /*!< Indicate whether optional parameters included */
    uint16_t xyl_lightness;        /*!< The present value of the Light xyL Lightness state */
    uint16_t xyl_x;                /*!< The present value of the Light xyL x state */
    uint16_t xyl_y;                /*!< The present value of the Light xyL y state */
    uint8_t  remain_time;          /*!< Time to complete state transition (optional) */
} esp_ble_mesh_light_xyl_status_cb_t;

/** Parameters of Light xyL Target Status */
typedef struct {
    bool     op_en;                /*!< Indicate whether optional parameters included */
    uint16_t target_xyl_lightness; /*!< The target value of the Light xyL Lightness state */
    uint16_t target_xyl_x;         /*!< The target value of the Light xyL x state */
    uint16_t target_xyl_y;         /*!< The target value of the Light xyL y state */
    uint8_t  remain_time;          /*!< Time to complete state transition (optional) */
} esp_ble_mesh_light_xyl_target_status_cb_t;

/** Parameters of Light xyL Default Status */
typedef struct {
    uint16_t lightness;        /*!< The value of the Light Lightness Default state */
    uint16_t xyl_x;            /*!< The value of the Light xyL x Default state */
    uint16_t xyl_y;            /*!< The value of the Light xyL y Default state */
} esp_ble_mesh_light_xyl_default_status_cb_t;

/** Parameters of Light xyL Range Status */
typedef struct {
    uint8_t  status_code;      /*!< Status Code for the requesting message */
    uint16_t xyl_x_range_min;  /*!< The value of the xyL x Range Min field of the Light xyL x Range state */
    uint16_t xyl_x_range_max;  /*!< The value of the xyL x Range Max field of the Light xyL x Range state */
    uint16_t xyl_y_range_min;  /*!< The value of the xyL y Range Min field of the Light xyL y Range state */
    uint16_t xyl_y_range_max;  /*!< The value of the xyL y Range Max field of the Light xyL y Range state */
} esp_ble_mesh_light_xyl_range_status_cb_t;

/** Parameter of Light LC Mode Status */
typedef struct {
    uint8_t mode;              /*!< The present value of the Light LC Mode state */
} esp_ble_mesh_light_lc_mode_status_cb_t;

/** Parameter of Light LC OM Status */
typedef struct {
    uint8_t mode;              /*!< The present value of the Light LC Occupancy Mode state */
} esp_ble_mesh_light_lc_om_status_cb_t;

/** Parameters of Light LC Light OnOff Status */
typedef struct {
    bool    op_en;                 /*!< Indicate whether optional parameters included */
    uint8_t present_light_onoff;   /*!< The present value of the Light LC Light OnOff state */
    uint8_t target_light_onoff;    /*!< The target value of the Light LC Light OnOff state (Optional) */
    uint8_t remain_time;           /*!< Time to complete state transition (C.1) */
} esp_ble_mesh_light_lc_light_onoff_status_cb_t;

/** Parameters of Light LC Property Status */
typedef struct {
    uint16_t property_id;      /*!< Property ID identifying a Light LC Property */
    struct net_buf_simple *property_value;  /*!< Raw value for the Light LC Property */
} esp_ble_mesh_light_lc_property_status_cb_t;

/**
 * @brief Lighting Client Model received message union
 */
typedef union {
    esp_ble_mesh_light_lightness_status_cb_t             lightness_status;             /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_STATUS */
    esp_ble_mesh_light_lightness_linear_status_cb_t      lightness_linear_status;      /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_LINEAR_STATUS */
    esp_ble_mesh_light_lightness_last_status_cb_t        lightness_last_status;        /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_LAST_STATUS */
    esp_ble_mesh_light_lightness_default_status_cb_t     lightness_default_status;     /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_DEFAULT_STATUS */
    esp_ble_mesh_light_lightness_range_status_cb_t       lightness_range_status;       /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LIGHTNESS_RANGE_STATUS */
    esp_ble_mesh_light_ctl_status_cb_t                   ctl_status;                   /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_CTL_STATUS */
    esp_ble_mesh_light_ctl_temperature_status_cb_t       ctl_temperature_status;       /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_CTL_TEMPERATURE_STATUS */
    esp_ble_mesh_light_ctl_temperature_range_status_cb_t ctl_temperature_range_status; /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_CTL_TEMPERATURE_RANGE_STATUS */
    esp_ble_mesh_light_ctl_default_status_cb_t           ctl_default_status;           /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_CTL_DEFAULT_STATUS */
    esp_ble_mesh_light_hsl_status_cb_t                   hsl_status;                   /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_STATUS */
    esp_ble_mesh_light_hsl_target_status_cb_t            hsl_target_status;            /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_TARGET_STATUS */
    esp_ble_mesh_light_hsl_hue_status_cb_t               hsl_hue_status;               /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_HUE_STATUS */
    esp_ble_mesh_light_hsl_saturation_status_cb_t        hsl_saturation_status;        /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_SATURATION_STATUS */
    esp_ble_mesh_light_hsl_default_status_cb_t           hsl_default_status;           /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_DEFAULT_STATUS */
    esp_ble_mesh_light_hsl_range_status_cb_t             hsl_range_status;             /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_HSL_RANGE_STATUS */
    esp_ble_mesh_light_xyl_status_cb_t                   xyl_status;                   /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_XYL_STATUS */
    esp_ble_mesh_light_xyl_target_status_cb_t            xyl_target_status;            /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_XYL_TARGET_STATUS */
    esp_ble_mesh_light_xyl_default_status_cb_t           xyl_default_status;           /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_XYL_DEFAULT_STATUS */
    esp_ble_mesh_light_xyl_range_status_cb_t             xyl_range_status;             /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_XYL_RANGE_STATUS */
    esp_ble_mesh_light_lc_mode_status_cb_t               lc_mode_status;               /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LC_MODE_STATUS */
    esp_ble_mesh_light_lc_om_status_cb_t                 lc_om_status;                 /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LC_OM_STATUS */
    esp_ble_mesh_light_lc_light_onoff_status_cb_t        lc_light_onoff_status;        /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LC_LIGHT_ONOFF_STATUS */
    esp_ble_mesh_light_lc_property_status_cb_t           lc_property_status;           /*!< For ESP_BLE_MESH_MODEL_OP_LIGHT_LC_PROPERTY_STATUS */
} esp_ble_mesh_light_client_status_cb_t;

/** Lighting Client Model callback parameters */
typedef struct {
    int error_code;                                     /*!< Appropriate error code */
    esp_ble_mesh_client_common_param_t   *params;       /*!< The client common parameters. */
    esp_ble_mesh_light_client_status_cb_t status_cb;    /*!< The light status message callback values */
} esp_ble_mesh_light_client_cb_param_t;

/** This enum value is the event of Lighting Client Model */
typedef enum {
    ESP_BLE_MESH_LIGHT_CLIENT_GET_STATE_EVT,
    ESP_BLE_MESH_LIGHT_CLIENT_SET_STATE_EVT,
    ESP_BLE_MESH_LIGHT_CLIENT_PUBLISH_EVT,
    ESP_BLE_MESH_LIGHT_CLIENT_TIMEOUT_EVT,
    ESP_BLE_MESH_LIGHT_CLIENT_EVT_MAX,
} esp_ble_mesh_light_client_cb_event_t;

/**
 *  @brief Bluetooth Mesh Light Client Model function.
 */

/**
 * @brief   Lighting Client Model callback function type
 * @param   event: Event type
 * @param   param: Pointer to callback parameter
 */
typedef void (* esp_ble_mesh_light_client_cb_t)(esp_ble_mesh_light_client_cb_event_t event,
                                                esp_ble_mesh_light_client_cb_param_t *param);

/**
 * @brief       Register BLE Mesh Light Client Model callback.
 *
 * @param[in]   callback: pointer to the callback function.
 *
 * @return      ESP_OK on success or error code otherwise.
 *
 */
esp_err_t esp_ble_mesh_register_light_client_callback(esp_ble_mesh_light_client_cb_t callback);

/**
 * @brief       Get the value of Light Server Model states using the Light Client Model get messages.
 *
 * @note        If you want to know the opcodes and corresponding meanings accepted by this API,
 *              please refer to esp_ble_mesh_light_message_opcode_t in esp_ble_mesh_defs.h
 *
 * @param[in]   params:    Pointer to BLE Mesh common client parameters.
 * @param[in]   get_state: Pointer of light get message value.
 *                         Shall not be set to NULL.
 *
 * @return      ESP_OK on success or error code otherwise.
 *
 */
esp_err_t esp_ble_mesh_light_client_get_state(esp_ble_mesh_client_common_param_t *params,
                                              esp_ble_mesh_light_client_get_state_t *get_state);

/**
 * @brief       Set the value of Light Server Model states using the Light Client Model set messages.
 *
 * @note        If you want to know the opcodes and corresponding meanings accepted by this API,
 *              please refer to esp_ble_mesh_light_message_opcode_t in esp_ble_mesh_defs.h
 *
 * @param[in]   params:    Pointer to BLE Mesh common client parameters.
 * @param[in]   set_state: Pointer of light set message value.
 *                         Shall not be set to NULL.
 *
 * @return      ESP_OK on success or error code otherwise.
 *
 */
esp_err_t esp_ble_mesh_light_client_set_state(esp_ble_mesh_client_common_param_t *params,
                                              esp_ble_mesh_light_client_set_state_t *set_state);

/**
 * @brief Lighting Server Models related context.
 */

/** @def    ESP_BLE_MESH_MODEL_LIGHT_LIGHTNESS_SRV
 *
 *  @brief  Define a new Light Lightness Server Model.
 *
 *  @note   1. The Light Lightness Server model extends the Generic Power OnOff
 *             Server model and the Generic Level Server model. When this model
 *             is present on an Element, the corresponding Light Lightness Setup
 *             Server model shall also be present.
 *          2. This model shall support model publication and model subscription.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_lightness_srv_t.
 *
 *  @return New Light Lightness Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_LIGHTNESS_SRV(srv_pub, srv_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_LIGHTNESS_SRV,     \
                    NULL, srv_pub, srv_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_LIGHTNESS_SETUP_SRV
 *
 *  @brief  Define a new Light Lightness Setup Server Model.
 *
 *  @note   1. The Light Lightness Setup Server model extends the Light Lightness
 *             Server model and the Generic Power OnOff Setup Server model.
 *          2. This model shall support model subscription.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_lightness_setup_srv_t.
 *
 *  @return New Light Lightness Setup Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_LIGHTNESS_SETUP_SRV(srv_pub, srv_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_LIGHTNESS_SETUP_SRV,     \
                    NULL, srv_pub, srv_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_CTL_SRV
 *
 *  @brief  Define a new Light CTL Server Model.
 *
 *  @note   1. The Light CTL Server model extends the Light Lightness Server model.
 *             When this model is present on an Element, the corresponding Light
 *             CTL Temperature Server model and the corresponding Light CTL Setup
 *             Server model shall also be present.
 *          2. This model shall support model publication and model subscription.
 *          3. The model requires two elements: the main element and the Temperature
 *             element. The Temperature element contains the corresponding Light CTL
 *             Temperature Server model and an instance of a Generic Level state
 *             bound to the Light CTL Temperature state on the Temperature element.
 *             The Light CTL Temperature state on the Temperature element is bound to
 *             the Light CTL state on the main element.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_ctl_srv_t.
 *
 *  @return New Light CTL Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_CTL_SRV(srv_pub, srv_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_CTL_SRV,     \
                    NULL, srv_pub, srv_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_CTL_SETUP_SRV
 *
 *  @brief  Define a new Light CTL Setup Server Model.
 *
 *  @note   1. The Light CTL Setup Server model extends the Light CTL Server and
 *             the Light Lightness Setup Server.
 *          2. This model shall support model subscription.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_ctl_setup_srv_t.
 *
 *  @return New Light CTL Setup Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_CTL_SETUP_SRV(srv_pub, srv_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_CTL_SETUP_SRV,     \
                    NULL, srv_pub, srv_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_CTL_TEMP_SRV
 *
 *  @brief  Define a new Light CTL Temperature Server Model.
 *
 *  @note   1. The Light CTL Temperature Server model extends the Generic Level
 *             Server model.
 *          2. This model shall support model publication and model subscription.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_ctl_temp_srv_t.
 *
 *  @return New Light CTL Temperature Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_CTL_TEMP_SRV(srv_pub, srv_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_CTL_TEMP_SRV,     \
                    NULL, srv_pub, srv_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_HSL_SRV
 *
 *  @brief  Define a new Light HSL Server Model.
 *
 *  @note   1. The Light HSL Server model extends the Light Lightness Server model. When
 *             this model is present on an Element, the corresponding Light HSL Hue
 *             Server model and the corresponding Light HSL Saturation Server model and
 *             the corresponding Light HSL Setup Server model shall also be present.
 *          2. This model shall support model publication and model subscription.
 *          3. The model requires three elements: the main element and the Hue element
 *             and the Saturation element. The Hue element contains the corresponding
 *             Light HSL Hue Server model and an instance of a Generic Level state bound
 *             to the Light HSL Hue state on the Hue element. The Saturation element
 *             contains the corresponding Light HSL Saturation Server model and an
 *             instance of a Generic Level state bound to the Light HSL Saturation state
 *             on the Saturation element. The Light HSL Hue state on the Hue element is
 *             bound to the Light HSL state on the main element and the Light HSL
 *             Saturation state on the Saturation element is bound to the Light HSL state
 *             on the main element.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_hsl_srv_t.
 *
 *  @return New Light HSL Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_HSL_SRV(srv_pub, srv_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_HSL_SRV,     \
                    NULL, srv_pub, srv_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_HSL_SETUP_SRV
 *
 *  @brief  Define a new Light HSL Setup Server Model.
 *
 *  @note   1. The Light HSL Setup Server model extends the Light HSL Server and
 *             the Light Lightness Setup Server.
 *          2. This model shall support model subscription.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_hsl_setup_srv_t.
 *
 *  @return New Light HSL Setup Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_HSL_SETUP_SRV(srv_pub, srv_data)           \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_HSL_SETUP_SRV,   \
                    NULL, srv_pub, srv_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_HSL_HUE_SRV
 *
 *  @brief  Define a new Light HSL Hue Server Model.
 *
 *  @note   1. The Light HSL Hue Server model extends the Generic Level Server model.
 *             This model is associated with the Light HSL Server model.
 *          2. This model shall support model publication and model subscription.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_hsl_hue_srv_t.
 *
 *  @return New Light HSL Hue Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_HSL_HUE_SRV(srv_pub, srv_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_HSL_HUE_SRV,     \
                    NULL, srv_pub, srv_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_HSL_SAT_SRV
 *
 *  @brief  Define a new Light HSL Saturation Server Model.
 *
 *  @note   1. The Light HSL Saturation Server model extends the Generic Level Server
 *             model. This model is associated with the Light HSL Server model.
 *          2. This model shall support model publication and model subscription.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_hsl_sat_srv_t.
 *
 *  @return New Light HSL Saturation Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_HSL_SAT_SRV(srv_pub, srv_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_HSL_SAT_SRV,     \
                    NULL, srv_pub, srv_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_XYL_SRV
 *
 *  @brief  Define a new Light xyL Server Model.
 *
 *  @note   1. The Light xyL Server model extends the Light Lightness Server model.
 *             When this model is present on an Element, the corresponding Light xyL
 *             Setup Server model shall also be present.
 *          2. This model shall support model publication and model subscription.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_xyl_srv_t.
 *
 *  @return New Light xyL Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_XYL_SRV(srv_pub, srv_data)             \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_XYL_SRV,     \
                    NULL, srv_pub, srv_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_XYL_SETUP_SRV
 *
 *  @brief  Define a new Light xyL Setup Server Model.
 *
 *  @note   1. The Light xyL Setup Server model extends the Light xyL Server and
 *             the Light Lightness Setup Server.
 *          2. This model shall support model subscription.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_xyl_setup_srv_t.
 *
 *  @return New Light xyL Setup Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_XYL_SETUP_SRV(srv_pub, srv_data)           \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_XYL_SETUP_SRV,   \
                    NULL, srv_pub, srv_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_LC_SRV
 *
 *  @brief  Define a new Light LC Server Model.
 *
 *  @note   1. The Light LC (Lightness Control) Server model extends the Light
 *             Lightness Server model and the Generic OnOff Server model. When
 *             this model is present on an Element, the corresponding Light LC
 *             Setup Server model shall also be present.
 *          2. This model shall support model publication and model subscription.
 *          3. This model may be used to represent an element that is a client to
 *             a Sensor Server model and controls the Light Lightness Actual state
 *             via defined state bindings.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_lc_srv_t.
 *
 *  @return New Light LC Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_LC_SRV(srv_pub, srv_data)           \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_LC_SRV,   \
                    NULL, srv_pub, srv_data)

/** @def    ESP_BLE_MESH_MODEL_LIGHT_LC_SETUP_SRV
 *
 *  @brief  Define a new Light LC Setup Server Model.
 *
 *  @note   1. The Light LC (Lightness Control) Setup model extends the Light LC
 *             Server model.
 *          2. This model shall support model publication and model subscription.
 *          3. This model may be used to configure setup parameters for the Light
 *             LC Server model.
 *
 *  @param  srv_pub  Pointer to the unique struct esp_ble_mesh_model_pub_t.
 *  @param  srv_data Pointer to the unique struct esp_ble_mesh_light_lc_setup_srv_t.
 *
 *  @return New Light LC Setup Server Model instance.
 */
#define ESP_BLE_MESH_MODEL_LIGHT_LC_SETUP_SRV(srv_pub, srv_data)           \
        ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_LIGHT_LC_SETUP_SRV,   \
                    NULL, srv_pub, srv_data)

/** Parameters of Light Lightness state */
typedef struct {
    uint16_t lightness_linear;          /*!< The present value of Light Lightness Linear state */
    uint16_t target_lightness_linear;   /*!< The target value of Light Lightness Linear state */

    uint16_t lightness_actual;          /*!< The present value of Light Lightness Actual state */
    uint16_t target_lightness_actual;   /*!< The target value of Light Lightness Actual state */

    uint16_t lightness_last;            /*!< The value of Light Lightness Last state */
    uint16_t lightness_default;         /*!< The value of Light Lightness Default state */

    uint8_t  status_code;               /*!< The status code of setting Light Lightness Range state */
    uint16_t lightness_range_min;       /*!< The minimum value of Light Lightness Range state */
    uint16_t lightness_range_max;       /*!< The maximum value of Light Lightness Range state */
} esp_ble_mesh_light_lightness_state_t;

/** User data of Light Lightness Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;                    /*!< Pointer to the Lighting Lightness Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;        /*!< Response control of the server model received messages */
    esp_ble_mesh_light_lightness_state_t *state;    /*!< Parameters of the Light Lightness state */
    esp_ble_mesh_last_msg_info_t last;              /*!< Parameters of the last received set message */
    esp_ble_mesh_state_transition_t actual_transition;  /*!< Parameters of state transition */
    esp_ble_mesh_state_transition_t linear_transition;  /*!< Parameters of state transition */
    int32_t tt_delta_lightness_actual;      /*!< Delta change value of lightness actual state transition */
    int32_t tt_delta_lightness_linear;      /*!< Delta change value of lightness linear state transition */
} esp_ble_mesh_light_lightness_srv_t;

/** User data of Light Lightness Setup Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;                    /*!< Pointer to the Lighting Lightness Setup Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;        /*!< Response control of the server model received messages */
    esp_ble_mesh_light_lightness_state_t *state;    /*!< Parameters of the Light Lightness state */
} esp_ble_mesh_light_lightness_setup_srv_t;

/** Parameters of Light CTL state */
typedef struct {
    uint16_t lightness;             /*!< The present value of Light CTL Lightness state */
    uint16_t target_lightness;      /*!< The target value of Light CTL Lightness state */

    uint16_t temperature;           /*!< The present value of Light CTL Temperature state */
    uint16_t target_temperature;    /*!< The target value of Light CTL Temperature state */

    int16_t  delta_uv;              /*!< The present value of Light CTL Delta UV state */
    int16_t  target_delta_uv;       /*!< The target value of Light CTL Delta UV state */

    uint8_t  status_code;           /*!< The statue code of setting Light CTL Temperature Range state */
    uint16_t temperature_range_min; /*!< The minimum value of Light CTL Temperature Range state */
    uint16_t temperature_range_max; /*!< The maximum value of Light CTL Temperature Range state */

    uint16_t lightness_default;     /*!< The value of Light Lightness Default state */
    uint16_t temperature_default;   /*!< The value of Light CTL Temperature Default state */
    int16_t  delta_uv_default;      /*!< The value of Light CTL Delta UV Default state */
} esp_ble_mesh_light_ctl_state_t;

/** User data of Light CTL Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;                /*!< Pointer to the Lighting CTL Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;    /*!< Response control of the server model received messages */
    esp_ble_mesh_light_ctl_state_t *state;      /*!< Parameters of the Light CTL state */
    esp_ble_mesh_last_msg_info_t last;          /*!< Parameters of the last received set message */
    esp_ble_mesh_state_transition_t transition; /*!< Parameters of state transition */
    int32_t tt_delta_lightness;     /*!< Delta change value of lightness state transition */
    int32_t tt_delta_temperature;   /*!< Delta change value of temperature state transition */
    int32_t tt_delta_delta_uv;      /*!< Delta change value of delta uv state transition */
} esp_ble_mesh_light_ctl_srv_t;

/** User data of Light CTL Setup Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;                /*!< Pointer to the Lighting CTL Setup Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;    /*!< Response control of the server model received messages */
    esp_ble_mesh_light_ctl_state_t *state;      /*!< Parameters of the Light CTL state */
} esp_ble_mesh_light_ctl_setup_srv_t;

/** User data of Light CTL Temperature Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;                /*!< Pointer to the Lighting CTL Temperature Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;    /*!< Response control of the server model received messages */
    esp_ble_mesh_light_ctl_state_t *state;      /*!< Parameters of the Light CTL state */
    esp_ble_mesh_last_msg_info_t last;          /*!< Parameters of the last received set message */
    esp_ble_mesh_state_transition_t transition; /*!< Parameters of state transition */
    int32_t tt_delta_temperature;   /*!< Delta change value of temperature state transition */
    int32_t tt_delta_delta_uv;      /*!< Delta change value of delta uv state transition */
} esp_ble_mesh_light_ctl_temp_srv_t;

/** Parameters of Light HSL state */
typedef struct {
    uint16_t lightness;             /*!< The present value of Light HSL Lightness state */
    uint16_t target_lightness;      /*!< The target value of Light HSL Lightness state */

    uint16_t hue;                   /*!< The present value of Light HSL Hue state */
    uint16_t target_hue;            /*!< The target value of Light HSL Hue state */

    uint16_t saturation;            /*!< The present value of Light HSL Saturation state */
    uint16_t target_saturation;     /*!< The target value of Light HSL Saturation state */

    uint16_t lightness_default;     /*!< The value of Light Lightness Default state */
    uint16_t hue_default;           /*!< The value of Light HSL Hue Default state */
    uint16_t saturation_default;    /*!< The value of Light HSL Saturation Default state */

    uint8_t  status_code;           /*!< The status code of setting Light HSL Hue & Saturation Range state */
    uint16_t hue_range_min;         /*!< The minimum value of Light HSL Hue Range state */
    uint16_t hue_range_max;         /*!< The maximum value of Light HSL Hue Range state */
    uint16_t saturation_range_min;  /*!< The minimum value of Light HSL Saturation state */
    uint16_t saturation_range_max;  /*!< The maximum value of Light HSL Saturation state */
} esp_ble_mesh_light_hsl_state_t;

/** User data of Light HSL Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;                /*!< Pointer to the Lighting HSL Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;    /*!< Response control of the server model received messages */
    esp_ble_mesh_light_hsl_state_t *state;      /*!< Parameters of the Light HSL state */
    esp_ble_mesh_last_msg_info_t last;          /*!< Parameters of the last received set message */
    esp_ble_mesh_state_transition_t transition; /*!< Parameters of state transition */
    int32_t tt_delta_lightness;     /*!< Delta change value of lightness state transition */
    int32_t tt_delta_hue;           /*!< Delta change value of hue state transition */
    int32_t tt_delta_saturation;    /*!< Delta change value of saturation state transition */
} esp_ble_mesh_light_hsl_srv_t;

/** User data of Light HSL Setup Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;                /*!< Pointer to the Lighting HSL Setup Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;    /*!< Response control of the server model received messages */
    esp_ble_mesh_light_hsl_state_t *state;      /*!< Parameters of the Light HSL state */
} esp_ble_mesh_light_hsl_setup_srv_t;

/** User data of Light HSL Hue Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;                /*!< Pointer to the Lighting HSL Hue Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;    /*!< Response control of the server model received messages */
    esp_ble_mesh_light_hsl_state_t *state;      /*!< Parameters of the Light HSL state */
    esp_ble_mesh_last_msg_info_t last;          /*!< Parameters of the last received set message */
    esp_ble_mesh_state_transition_t transition; /*!< Parameters of state transition */
    int32_t tt_delta_hue;   /*!< Delta change value of hue state transition */
} esp_ble_mesh_light_hsl_hue_srv_t;

/** User data of Light HSL Saturation Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;    /*!< Pointer to the Lighting HSL Saturation Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;    /*!< Response control of the server model received messages */
    esp_ble_mesh_light_hsl_state_t *state;      /*!< Parameters of the Light HSL state */
    esp_ble_mesh_last_msg_info_t last;          /*!< Parameters of the last received set message */
    esp_ble_mesh_state_transition_t transition; /*!< Parameters of state transition */
    int32_t tt_delta_saturation;    /*!< Delta change value of saturation state transition */
} esp_ble_mesh_light_hsl_sat_srv_t;

/** Parameters of Light xyL state */
typedef struct {
    uint16_t lightness;         /*!< The present value of Light xyL Lightness state */
    uint16_t target_lightness;  /*!< The target value of Light xyL Lightness state */

    uint16_t x;                 /*!< The present value of Light xyL x state */
    uint16_t target_x;          /*!< The target value of Light xyL x state */

    uint16_t y;                 /*!< The present value of Light xyL y state */
    uint16_t target_y;          /*!< The target value of Light xyL y state */

    uint16_t lightness_default; /*!< The value of Light Lightness Default state */
    uint16_t x_default;         /*!< The value of Light xyL x Default state */
    uint16_t y_default;         /*!< The value of Light xyL y Default state */

    uint8_t  status_code;       /*!< The status code of setting Light xyL x & y Range state */
    uint16_t x_range_min;       /*!< The minimum value of Light xyL x Range state */
    uint16_t x_range_max;       /*!< The maximum value of Light xyL x Range state */
    uint16_t y_range_min;       /*!< The minimum value of Light xyL y Range state */
    uint16_t y_range_max;       /*!< The maximum value of Light xyL y Range state */
} esp_ble_mesh_light_xyl_state_t;

/** User data of Light xyL Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;                /*!< Pointer to the Lighting xyL Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;    /*!< Response control of the server model received messages */
    esp_ble_mesh_light_xyl_state_t *state;      /*!< Parameters of the Light xyL state */
    esp_ble_mesh_last_msg_info_t last;          /*!< Parameters of the last received set message */
    esp_ble_mesh_state_transition_t transition; /*!< Parameters of state transition */
    int32_t tt_delta_lightness; /*!< Delta change value of lightness state transition */
    int32_t tt_delta_x;         /*!< Delta change value of x state transition */
    int32_t tt_delta_y;         /*!< Delta change value of y state transition */
} esp_ble_mesh_light_xyl_srv_t;

/** User data of Light xyL Setup Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;                /*!< Pointer to the Lighting xyL Setup Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;    /*!< Response control of the server model received messages */
    esp_ble_mesh_light_xyl_state_t *state;      /*!< Parameters of the Light xyL state */
} esp_ble_mesh_light_xyl_setup_srv_t;

/** Parameters of Light LC states */
typedef struct {
    /**
     * 0b0 The controller is turned off.
     * - The binding with the Light Lightness state is disabled.
     * 0b1 The controller is turned on.
     * - The binding with the Light Lightness state is enabled.
     */
    uint32_t mode : 1,                  /*!< The value of Light LC Mode state */
             occupancy_mode : 1,        /*!< The value of Light LC Occupancy Mode state */
             light_onoff : 1,           /*!< The present value of Light LC Light OnOff state */
             target_light_onoff : 1,    /*!< The target value of Light LC Light OnOff state */
             occupancy : 1,             /*!< The value of Light LC Occupancy state */
             ambient_luxlevel : 24;     /*!< The value of Light LC Ambient LuxLevel state */

    /**
     * 1. Light LC Linear Output = max((Lightness Out)^2/65535, Regulator Output)
     * 2. If the Light LC Mode state is set to 0b1, the binding is enabled and upon
     *    a change of the Light LC Linear Output state, the following operation
     *    shall be performed:
     *    Light Lightness Linear = Light LC Linear Output
     * 3. If the Light LC Mode state is set to 0b0, the binding is disabled (i.e.,
     *    upon a change of the Light LC Linear Output state, no operation on the
     *    Light Lightness Linear state is performed).
     */
    uint16_t linear_output;     /*!< The value of Light LC Linear Output state */
} esp_ble_mesh_light_lc_state_t;

/**
 * Parameters of Light Property states.
 * The Light LC Property states are read / write states that determine the
 * configuration of a Light Lightness Controller. Each state is represented
 * by a device property and is controlled by Light LC Property messages.
 */
typedef struct {
    /**
     * A timing state that determines the delay for changing the Light LC
     * Occupancy state upon receiving a Sensor Status message from an
     * occupancy sensor.
     */
    uint32_t time_occupancy_delay;  /*!< The value of Light LC Time Occupancy Delay state */
    /**
     * A timing state that determines the time the controlled lights fade
     * to the level determined by the Light LC Lightness On state.
     */
    uint32_t time_fade_on;      /*!< The value of Light LC Time Fade On state */
    /**
     * A timing state that determines the time the controlled lights stay
     * at the level determined by the Light LC Lightness On state.
     */
    uint32_t time_run_on;       /*!< The value of Light LC Time Run On state */
    /**
     * A timing state that determines the time the controlled lights fade
     * from the level determined by the Light LC Lightness On state to the
     * level determined by the Light Lightness Prolong state.
     */
    uint32_t time_fade;         /*!< The value of Light LC Time Fade state */
    /**
     * A timing state that determines the time the controlled lights stay at
     * the level determined by the Light LC Lightness Prolong state.
     */
    uint32_t time_prolong;      /*!< The value of Light LC Time Prolong state */
    /**
     * A timing state that determines the time the controlled lights fade from
     * the level determined by the Light LC Lightness Prolong state to the level
     * determined by the Light LC Lightness Standby state when the transition is
     * automatic.
     */
    uint32_t time_fade_standby_auto;    /*!< The value of Light LC Time Fade Standby Auto state */
    /**
     * A timing state that determines the time the controlled lights fade from
     * the level determined by the Light LC Lightness Prolong state to the level
     * determined by the Light LC Lightness Standby state when the transition is
     * triggered by a change in the Light LC Light OnOff state.
     */
    uint32_t time_fade_standby_manual;  /*!< The value of Light LC Time Fade Standby Manual state */

    /**
     * A lightness state that determines the perceptive light lightness at the
     * Occupancy and Run internal controller states.
     */
    uint16_t lightness_on;          /*!< The value of Light LC Lightness On state */
    /**
     * A lightness state that determines the light lightness at the Prolong
     * internal controller state.
     */
    uint16_t lightness_prolong;     /*!< The value of Light LC Lightness Prolong state */
    /**
     * A lightness state that determines the light lightness at the Standby
     * internal controller state.
     */
    uint16_t lightness_standby;     /*!< The value of Light LC Lightness Standby state */

    /**
     * A uint16 state representing the Ambient LuxLevel level that determines
     * if the controller transitions from the Light Control Standby state.
     */
    uint16_t ambient_luxlevel_on;       /*!< The value of Light LC Ambient LuxLevel On state */
    /**
     * A uint16 state representing the required Ambient LuxLevel level in the
     * Prolong state.
     */
    uint16_t ambient_luxlevel_prolong;  /*!< The value of Light LC Ambient LuxLevel Prolong state */
    /**
     * A uint16 state representing the required Ambient LuxLevel level in the
     * Standby state.
     */
    uint16_t ambient_luxlevel_standby;  /*!< The value of Light LC Ambient LuxLevel Standby state */

    /**
     * A float32 state representing the integral coefficient that determines the
     * integral part of the equation defining the output of the Light LC PI
     * Feedback Regulator, when Light LC Ambient LuxLevel is less than LuxLevel
     * Out. Valid range: 0.0 ~ 1000.0. The default value is 250.0.
     */
    float regulator_kiu;    /*!< The value of Light LC Regulator Kiu state */
    /**
     * A float32 state representing the integral coefficient that determines the
     * integral part of the equation defining the output of the Light LC PI
     * Feedback Regulator, when Light LC Ambient LuxLevel is greater than or equal
     * to the value of the LuxLevel Out state. Valid range: 0.0 ~ 1000.0. The
     * default value is 25.0.
     */
    float regulator_kid;    /*!< The value of Light LC Regulator Kid state */
    /**
     * A float32 state representing the proportional coefficient that determines
     * the proportional part of the equation defining the output of the Light LC
     * PI Feedback Regulator, when Light LC Ambient LuxLevel is less than the value
     * of the LuxLevel Out state. Valid range: 0.0 ~ 1000.0. The default value is 80.0.
     */
    float regulator_kpu;    /*!< The value of Light LC Regulator Kpu state */
    /**
     * A float32 state representing the proportional coefficient that determines
     * the proportional part of the equation defining the output of the Light LC PI
     * Feedback Regulator, when Light LC Ambient LuxLevel is greater than or equal
     * to the value of the LuxLevel Out state. Valid range: 0.0 ~ 1000.0. The default
     * value is 80.0.
     */
    float regulator_kpd;    /*!< The value of Light LC Regulator Kpd state */
    /**
     * A int8 state representing the percentage accuracy of the Light LC PI Feedback
     * Regulator. Valid range: 0.0 ~ 100.0. The default value is 2.0.
     */
    int8_t regulator_accuracy;  /*!< The value of Light LC Regulator Accuracy state */

    /**
     * If the message Raw field contains a Raw Value for the Time Since Motion
     * Sensed device property, which represents a value less than or equal to
     * the value of the Light LC Occupancy Delay state, it shall delay setting
     * the Light LC Occupancy state to 0b1 by the difference between the value
     * of the Light LC Occupancy Delay state and the received Time Since Motion
     * value.
     */
    uint32_t set_occupancy_to_1_delay;  /*!< The value of the difference between value of the
                                            Light LC Occupancy Delay state and the received
                                            Time Since Motion value */
} esp_ble_mesh_light_lc_property_state_t;

/** This enum value is the Light LC State Machine states */
typedef enum {
    ESP_BLE_MESH_LC_OFF,
    ESP_BLE_MESH_LC_STANDBY,
    ESP_BLE_MESH_LC_FADE_ON,
    ESP_BLE_MESH_LC_RUN,
    ESP_BLE_MESH_LC_FADE,
    ESP_BLE_MESH_LC_PROLONG,
    ESP_BLE_MESH_LC_FADE_STANDBY_AUTO,
    ESP_BLE_MESH_LC_FADE_STANDBY_MANUAL,
} esp_ble_mesh_lc_state_t;

/** Parameters of Light LC state machine */
typedef struct {
    /**
     * The Fade On, Fade, Fade Standby Auto, and Fade Standby Manual states are
     * transition states that define the transition of the Lightness Out and
     * LuxLevel Out states. This transition can be started as a result of the
     * Light LC State Machine change or as a result of receiving the Light LC
     * Light OnOff Set or Light LC Light Set Unacknowledged message.
     */
    struct {
        uint8_t fade_on;                /*!< The value of transition time of Light LC Time Fade On */
        uint8_t fade;                   /*!< The value of transition time of Light LC Time Fade */
        uint8_t fade_standby_auto;      /*!< The value of transition time of Light LC Time Fade Standby Auto */
        uint8_t fade_standby_manual;    /*!< The value of transition time of Light LC Time Fade Standby Manual */
    } trans_time;                       /*!< The value of transition time */
    esp_ble_mesh_lc_state_t state;      /*!< The value of Light LC state machine state */
    struct k_delayed_work timer;        /*!< Timer of Light LC state machine */
} esp_ble_mesh_light_lc_state_machine_t;

/** Parameters of Light Lightness controller */
typedef struct {
    esp_ble_mesh_light_lc_state_t          state;           /*!< Parameters of Light LC state */
    esp_ble_mesh_light_lc_property_state_t prop_state;      /*!< Parameters of Light LC Property state */
    esp_ble_mesh_light_lc_state_machine_t  state_machine;   /*!< Parameters of Light LC state machine */
} esp_ble_mesh_light_control_t;

/** User data of Light LC Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;                /*!< Pointer to the Lighting LC Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;    /*!< Response control of the server model received messages */
    esp_ble_mesh_light_control_t *lc;           /*!< Parameters of the Light controller */
    esp_ble_mesh_last_msg_info_t last;          /*!< Parameters of the last received set message */
    esp_ble_mesh_state_transition_t transition; /*!< Parameters of state transition */
} esp_ble_mesh_light_lc_srv_t;

/** User data of Light LC Setup Server Model */
typedef struct {
    esp_ble_mesh_model_t *model;                /*!< Pointer to the Lighting LC Setup Server Model. Initialized internally. */
    esp_ble_mesh_server_rsp_ctrl_t rsp_ctrl;    /*!< Response control of the server model received messages */
    esp_ble_mesh_light_control_t *lc;           /*!< Parameters of the Light controller */
} esp_ble_mesh_light_lc_setup_srv_t;

/** Parameter of Light Lightness Actual state change event */
typedef struct {
    uint16_t lightness;     /*!< The value of Light Lightness Actual state */
} esp_ble_mesh_state_change_light_lightness_set_t;

/** Parameter of Light Lightness Linear state change event */
typedef struct {
    uint16_t lightness;     /*!< The value of Light Lightness Linear state */
} esp_ble_mesh_state_change_light_lightness_linear_set_t;

/** Parameter of Light Lightness Default state change event */
typedef struct {
    uint16_t lightness;     /*!< The value of Light Lightness Default state */
} esp_ble_mesh_state_change_light_lightness_default_set_t;

/** Parameters of Light Lightness Range state change event */
typedef struct {
    uint16_t range_min;     /*!< The minimum value of Light Lightness Range state */
    uint16_t range_max;     /*!< The maximum value of Light Lightness Range state */
} esp_ble_mesh_state_change_light_lightness_range_set_t;

/** Parameters of Light CTL state change event */
typedef struct {
    uint16_t lightness;     /*!< The value of Light CTL Lightness state */
    uint16_t temperature;   /*!< The value of Light CTL Temperature state */
    int16_t  delta_uv;      /*!< The value of Light CTL Delta UV state */
} esp_ble_mesh_state_change_light_ctl_set_t;

/** Parameters of Light CTL Temperature state change event */
typedef struct {
    uint16_t temperature;   /*!< The value of Light CTL Temperature state */
    int16_t  delta_uv;      /*!< The value of Light CTL Delta UV state */
} esp_ble_mesh_state_change_light_ctl_temperature_set_t;

/** Parameters of Light CTL Temperature Range state change event */
typedef struct {
    uint16_t range_min;     /*!< The minimum value of Light CTL Temperature Range state */
    uint16_t range_max;     /*!< The maximum value of Light CTL Temperature Range state */
} esp_ble_mesh_state_change_light_ctl_temperature_range_set_t;

/** Parameters of Light CTL Default state change event */
typedef struct {
    uint16_t lightness;     /*!< The value of Light Lightness Default state */
    uint16_t temperature;   /*!< The value of Light CTL Temperature Default state */
    int16_t  delta_uv;      /*!< The value of Light CTL Delta UV Default state */
} esp_ble_mesh_state_change_light_ctl_default_set_t;

/** Parameters of Light HSL state change event */
typedef struct {
    uint16_t lightness;     /*!< The value of Light HSL Lightness state */
    uint16_t hue;           /*!< The value of Light HSL Hue state */
    uint16_t saturation;    /*!< The value of Light HSL Saturation state */
} esp_ble_mesh_state_change_light_hsl_set_t;

/** Parameter of Light HSL Hue state change event */
typedef struct {
    uint16_t hue;           /*!< The value of Light HSL Hue state */
} esp_ble_mesh_state_change_light_hsl_hue_set_t;

/** Parameter of Light HSL Saturation state change event */
typedef struct {
    uint16_t saturation;    /*!< The value of Light HSL Saturation state */
} esp_ble_mesh_state_change_light_hsl_saturation_set_t;

/** Parameters of Light HSL Default state change event */
typedef struct {
    uint16_t lightness;     /*!< The value of Light HSL Lightness Default state */
    uint16_t hue;           /*!< The value of Light HSL Hue Default state */
    uint16_t saturation;    /*!< The value of Light HSL Saturation Default state */
} esp_ble_mesh_state_change_light_hsl_default_set_t;

/** Parameters of Light HSL Range state change event */
typedef struct {
    uint16_t hue_range_min;         /*!< The minimum hue value of Light HSL Range state */
    uint16_t hue_range_max;         /*!< The maximum hue value of Light HSL Range state */
    uint16_t saturation_range_min;  /*!< The minimum saturation value of Light HSL Range state */
    uint16_t saturation_range_max;  /*!< The maximum saturation value of Light HSL Range state */
} esp_ble_mesh_state_change_light_hsl_range_set_t;

/** Parameters of Light xyL state change event */
typedef struct {
    uint16_t lightness;     /*!< The value of Light xyL Lightness state */
    uint16_t x;             /*!< The value of Light xyL x state */
    uint16_t y;             /*!< The value of Light xyL y state */
} esp_ble_mesh_state_change_light_xyl_set_t;

/** Parameters of Light xyL Default state change event */
typedef struct {
    uint16_t lightness;     /*!< The value of Light Lightness Default state */
    uint16_t x;             /*!< The value of Light xyL x Default state */
    uint16_t y;             /*!< The value of Light xyL y Default state */
} esp_ble_mesh_state_change_light_xyl_default_set_t;

/** Parameters of Light xyL Range state change event */
typedef struct {
    uint16_t x_range_min;   /*!< The minimum value of Light xyL x Range state */
    uint16_t x_range_max;   /*!< The maximum value of Light xyL x Range state */
    uint16_t y_range_min;   /*!< The minimum value of Light xyL y Range state */
    uint16_t y_range_max;   /*!< The maximum value of Light xyL y Range state */
} esp_ble_mesh_state_change_light_xyl_range_set_t;

/** Parameter of Light LC Mode state change event */
typedef struct {
    uint8_t mode;       /*!< The value of Light LC Mode state */
} esp_ble_mesh_state_change_light_lc_mode_set_t;

/** Parameter of Light LC Occupancy Mode state change event */
typedef struct {
    uint8_t mode;       /*!< The value of Light LC Occupancy Mode state */
} esp_ble_mesh_state_change_light_lc_om_set_t;

/** Parameter of Light LC Light OnOff state change event */
typedef struct {
    uint8_t onoff;      /*!< The value of Light LC Light OnOff state */
} esp_ble_mesh_state_change_light_lc_light_onoff_set_t;

/** Parameters of Light LC Property state change event */
typedef struct {
    uint16_t property_id;   /*!< The property id of Light LC Property state */
    struct net_buf_simple *property_value;  /*!< The property value of Light LC Property state */
} esp_ble_mesh_state_change_light_lc_property_set_t;

/** Parameters of Sensor Status state change event */
typedef struct {
    uint16_t property_id;       /*!< The value of Sensor Property ID */
    /** Parameters of Sensor Status related state */
    union {
        uint8_t  occupancy;                 /*!< The value of Light LC Occupancy state */
        uint32_t set_occupancy_to_1_delay;  /*!< The value of Light LC Set Occupancy to 1 Delay state */
        uint32_t ambient_luxlevel;          /*!< The value of Light LC Ambient Luxlevel state */
    } state;
} esp_ble_mesh_state_change_sensor_status_t;

/**
 * @brief Lighting Server Model state change value union
 */
typedef union {
    /**
     * The recv_op in ctx can be used to decide which state is changed.
     */
    esp_ble_mesh_state_change_light_lightness_set_t             lightness_set;          /*!< Light Lightness Set */
    esp_ble_mesh_state_change_light_lightness_linear_set_t      lightness_linear_set;   /*!< Light Lightness Linear Set */
    esp_ble_mesh_state_change_light_lightness_default_set_t     lightness_default_set;  /*!< Light Lightness Default Set */
    esp_ble_mesh_state_change_light_lightness_range_set_t       lightness_range_set;    /*!< Light Lightness Range Set */
    esp_ble_mesh_state_change_light_ctl_set_t                   ctl_set;                /*!< Light CTL Set */
    esp_ble_mesh_state_change_light_ctl_temperature_set_t       ctl_temp_set;           /*!< Light CTL Temperature Set */
    esp_ble_mesh_state_change_light_ctl_temperature_range_set_t ctl_temp_range_set;     /*!< Light CTL Temperature Range Set */
    esp_ble_mesh_state_change_light_ctl_default_set_t           ctl_default_set;        /*!< Light CTL Default Set */
    esp_ble_mesh_state_change_light_hsl_set_t                   hsl_set;                /*!< Light HSL Set */
    esp_ble_mesh_state_change_light_hsl_hue_set_t               hsl_hue_set;            /*!< Light HSL Hue Set */
    esp_ble_mesh_state_change_light_hsl_saturation_set_t        hsl_saturation_set;     /*!< Light HSL Saturation Set */
    esp_ble_mesh_state_change_light_hsl_default_set_t           hsl_default_set;        /*!< Light HSL Default Set */
    esp_ble_mesh_state_change_light_hsl_range_set_t             hsl_range_set;          /*!< Light HSL Range Set */
    esp_ble_mesh_state_change_light_xyl_set_t                   xyl_set;                /*!< Light xyL Set */
    esp_ble_mesh_state_change_light_xyl_default_set_t           xyl_default_set;        /*!< Light xyL Default Set */
    esp_ble_mesh_state_change_light_xyl_range_set_t             xyl_range_set;          /*!< Light xyL Range Set */
    esp_ble_mesh_state_change_light_lc_mode_set_t               lc_mode_set;            /*!< Light LC Mode Set */
    esp_ble_mesh_state_change_light_lc_om_set_t                 lc_om_set;              /*!< Light LC Occupancy Mode Set */
    esp_ble_mesh_state_change_light_lc_light_onoff_set_t        lc_light_onoff_set;     /*!< Light LC Light OnOff Set */
    esp_ble_mesh_state_change_light_lc_property_set_t           lc_property_set;        /*!< Light LC Property Set */
    esp_ble_mesh_state_change_sensor_status_t                   sensor_status;          /*!< Sensor Status */
} esp_ble_mesh_lighting_server_state_change_t;

/** Context of the received Light LC Property Get message */
typedef struct {
    uint16_t property_id;   /*!< Property ID identifying a Light LC Property */
} esp_ble_mesh_server_recv_light_lc_property_get_t;

/**
 * @brief Lighting Server Model received get message union
 */
typedef union {
    esp_ble_mesh_server_recv_light_lc_property_get_t lc_property;   /*!< Light LC Property Get */
} esp_ble_mesh_lighting_server_recv_get_msg_t;

/** Context of the received Light Lightness Set message */
typedef struct {
    bool     op_en;         /*!< Indicate if optional parameters are included */
    uint16_t lightness;     /*!< Target value of light lightness actual state */
    uint8_t  tid;           /*!< Transaction ID */
    uint8_t  trans_time;    /*!< Time to complete state transition (optional) */
    uint8_t  delay;         /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_server_recv_light_lightness_set_t;

/** Context of the received Light Lightness Linear Set message */
typedef struct {
    bool     op_en;         /*!< Indicate if optional parameters are included */
    uint16_t lightness;     /*!< Target value of light lightness linear state */
    uint8_t  tid;           /*!< Transaction ID */
    uint8_t  trans_time;    /*!< Time to complete state transition (optional) */
    uint8_t  delay;         /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_server_recv_light_lightness_linear_set_t;

/** Context of the received Light Lightness Default Set message */
typedef struct {
    uint16_t lightness;     /*!< The value of the Light Lightness Default state */
} esp_ble_mesh_server_recv_light_lightness_default_set_t;

/** Context of the received Light Lightness Range Set message */
typedef struct {
    uint16_t range_min;     /*!< Value of range min field of light lightness range state */
    uint16_t range_max;     /*!< Value of range max field of light lightness range state */
} esp_ble_mesh_server_recv_light_lightness_range_set_t;

/** Context of the received Light CTL Set message */
typedef struct {
    bool     op_en;         /*!< Indicate if optional parameters are included */
    uint16_t lightness;     /*!< Target value of light ctl lightness state */
    uint16_t temperature;   /*!< Target value of light ctl temperature state */
    int16_t  delta_uv;      /*!< Target value of light ctl delta UV state */
    uint8_t  tid;           /*!< Transaction ID */
    uint8_t  trans_time;    /*!< Time to complete state transition (optional) */
    uint8_t  delay;         /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_server_recv_light_ctl_set_t;

/** Context of the received Light CTL Temperature Set message */
typedef struct {
    bool     op_en;         /*!< Indicate if optional parameters are included */
    uint16_t temperature;   /*!< Target value of light ctl temperature state */
    int16_t  delta_uv;      /*!< Target value of light ctl delta UV state */
    uint8_t  tid;           /*!< Transaction ID */
    uint8_t  trans_time;    /*!< Time to complete state transition (optional) */
    uint8_t  delay;         /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_server_recv_light_ctl_temperature_set_t;

/** Context of the received Light CTL Temperature Range Set message */
typedef struct {
    uint16_t range_min;     /*!< Value of temperature range min field of light ctl temperature range state */
    uint16_t range_max;     /*!< Value of temperature range max field of light ctl temperature range state */
} esp_ble_mesh_server_recv_light_ctl_temperature_range_set_t;

/** Context of the received Light CTL Default Set message */
typedef struct {
    uint16_t lightness;     /*!< Value of light lightness default state */
    uint16_t temperature;   /*!< Value of light temperature default state */
    int16_t  delta_uv;      /*!< Value of light delta UV default state */
} esp_ble_mesh_server_recv_light_ctl_default_set_t;

/** Context of the received Light HSL Set message */
typedef struct {
    bool     op_en;         /*!< Indicate if optional parameters are included */
    uint16_t lightness;     /*!< Target value of light hsl lightness state */
    uint16_t hue;           /*!< Target value of light hsl hue state */
    uint16_t saturation;    /*!< Target value of light hsl saturation state */
    uint8_t  tid;           /*!< Transaction ID */
    uint8_t  trans_time;    /*!< Time to complete state transition (optional) */
    uint8_t  delay;         /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_server_recv_light_hsl_set_t;

/** Context of the received Light HSL Hue Set message */
typedef struct {
    bool     op_en;         /*!< Indicate if optional parameters are included */
    uint16_t hue;           /*!< Target value of light hsl hue state */
    uint8_t  tid;           /*!< Transaction ID */
    uint8_t  trans_time;    /*!< Time to complete state transition (optional) */
    uint8_t  delay;         /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_server_recv_light_hsl_hue_set_t;

/** Context of the received Light HSL Saturation Set message */
typedef struct {
    bool     op_en;         /*!< Indicate if optional parameters are included */
    uint16_t saturation;    /*!< Target value of light hsl hue state */
    uint8_t  tid;           /*!< Transaction ID */
    uint8_t  trans_time;    /*!< Time to complete state transition (optional) */
    uint8_t  delay;         /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_server_recv_light_hsl_saturation_set_t;

/** Context of the received Light HSL Default Set message */
typedef struct {
    uint16_t lightness;     /*!< Value of light lightness default state */
    uint16_t hue;           /*!< Value of light hue default state */
    uint16_t saturation;    /*!< Value of light saturation default state */
} esp_ble_mesh_server_recv_light_hsl_default_set_t;

/** Context of the received Light HSL Range Set message */
typedef struct {
    uint16_t hue_range_min;         /*!< Value of hue range min field of light hsl hue range state */
    uint16_t hue_range_max;         /*!< Value of hue range max field of light hsl hue range state */
    uint16_t saturation_range_min;  /*!< Value of saturation range min field of light hsl saturation range state */
    uint16_t saturation_range_max;  /*!< Value of saturation range max field of light hsl saturation range state */
} esp_ble_mesh_server_recv_light_hsl_range_set_t;

/** Context of the received Light xyL Set message */
typedef struct {
    bool     op_en;         /*!< Indicate whether optional parameters included */
    uint16_t lightness;     /*!< The target value of the Light xyL Lightness state */
    uint16_t x;             /*!< The target value of the Light xyL x state */
    uint16_t y;             /*!< The target value of the Light xyL y state */
    uint8_t  tid;           /*!< Transaction Identifier */
    uint8_t  trans_time;    /*!< Time to complete state transition (optional) */
    uint8_t  delay;         /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_server_recv_light_xyl_set_t;

/** Context of the received Light xyL Default Set message */
typedef struct {
    uint16_t lightness;     /*!< The value of the Light Lightness Default state */
    uint16_t x;             /*!< The value of the Light xyL x Default state */
    uint16_t y;             /*!< The value of the Light xyL y Default state */
} esp_ble_mesh_server_recv_light_xyl_default_set_t;

/** Context of the received Light xyl Range Set message */
typedef struct {
    uint16_t x_range_min;   /*!< The value of the xyL x Range Min field of the Light xyL x Range state */
    uint16_t x_range_max;   /*!< The value of the xyL x Range Max field of the Light xyL x Range state */
    uint16_t y_range_min;   /*!< The value of the xyL y Range Min field of the Light xyL y Range state */
    uint16_t y_range_max;   /*!< The value of the xyL y Range Max field of the Light xyL y Range state */
} esp_ble_mesh_server_recv_light_xyl_range_set_t;

/** Context of the received Light LC Mode Set message */
typedef struct {
    uint8_t mode;   /*!< The target value of the Light LC Mode state */
} esp_ble_mesh_server_recv_light_lc_mode_set_t;

/** Context of the received Light OM Set message */
typedef struct {
    uint8_t mode;   /*!< The target value of the Light LC Occupancy Mode state */
} esp_ble_mesh_server_recv_light_lc_om_set_t;

/** Context of the received Light LC Light OnOff Set message */
typedef struct {
    bool    op_en;          /*!< Indicate whether optional parameters included */
    uint8_t light_onoff;    /*!< The target value of the Light LC Light OnOff state */
    uint8_t tid;            /*!< Transaction Identifier */
    uint8_t trans_time;     /*!< Time to complete state transition (optional) */
    uint8_t delay;          /*!< Indicate message execution delay (C.1) */
} esp_ble_mesh_server_recv_light_lc_light_onoff_set_t;

/** Context of the received Light LC Property Set message */
typedef struct {
    uint16_t property_id;   /*!< Property ID identifying a Light LC Property */
    struct net_buf_simple *property_value;  /*!< Raw value for the Light LC Property */
} esp_ble_mesh_server_recv_light_lc_property_set_t;

/**
 * @brief Lighting Server Model received set message union
 */
typedef union {
    esp_ble_mesh_server_recv_light_lightness_set_t             lightness;           /*!< Light Lightness Set/Light Lightness Set Unack */
    esp_ble_mesh_server_recv_light_lightness_linear_set_t      lightness_linear;    /*!< Light Lightness Linear Set/Light Lightness Linear Set Unack */
    esp_ble_mesh_server_recv_light_lightness_default_set_t     lightness_default;   /*!< Light Lightness Default Set/Light Lightness Default Set Unack */
    esp_ble_mesh_server_recv_light_lightness_range_set_t       lightness_range;     /*!< Light Lightness Range Set/Light Lightness Range Set Unack */
    esp_ble_mesh_server_recv_light_ctl_set_t                   ctl;                 /*!< Light CTL Set/Light CTL Set Unack */
    esp_ble_mesh_server_recv_light_ctl_temperature_set_t       ctl_temp;            /*!< Light CTL Temperature Set/Light CTL Temperature Set Unack */
    esp_ble_mesh_server_recv_light_ctl_temperature_range_set_t ctl_temp_range;      /*!< Light CTL Temperature Range Set/Light CTL Temperature Range Set Unack */
    esp_ble_mesh_server_recv_light_ctl_default_set_t           ctl_default;         /*!< Light CTL Default Set/Light CTL Default Set Unack */
    esp_ble_mesh_server_recv_light_hsl_set_t                   hsl;                 /*!< Light HSL Set/Light HSL Set Unack */
    esp_ble_mesh_server_recv_light_hsl_hue_set_t               hsl_hue;             /*!< Light HSL Hue Set/Light HSL Hue Set Unack */
    esp_ble_mesh_server_recv_light_hsl_saturation_set_t        hsl_saturation;      /*!< Light HSL Saturation Set/Light HSL Saturation Set Unack */
    esp_ble_mesh_server_recv_light_hsl_default_set_t           hsl_default;         /*!< Light HSL Default Set/Light HSL Default Set Unack */
    esp_ble_mesh_server_recv_light_hsl_range_set_t             hsl_range;           /*!< Light HSL Range Set/Light HSL Range Set Unack */
    esp_ble_mesh_server_recv_light_xyl_set_t                   xyl;                 /*!< Light xyL Set/Light xyL Set Unack */
    esp_ble_mesh_server_recv_light_xyl_default_set_t           xyl_default;         /*!< Light xyL Default Set/Light xyL Default Set Unack */
    esp_ble_mesh_server_recv_light_xyl_range_set_t             xyl_range;           /*!< Light xyL Range Set/Light xyL Range Set Unack */
    esp_ble_mesh_server_recv_light_lc_mode_set_t               lc_mode;             /*!< Light LC Mode Set/Light LC Mode Set Unack */
    esp_ble_mesh_server_recv_light_lc_om_set_t                 lc_om;               /*!< Light LC OM Set/Light LC OM Set Unack */
    esp_ble_mesh_server_recv_light_lc_light_onoff_set_t        lc_light_onoff;      /*!< Light LC Light OnOff Set/Light LC Light OnOff Set Unack */
    esp_ble_mesh_server_recv_light_lc_property_set_t           lc_property;         /*!< Light LC Property Set/Light LC Property Set Unack */
} esp_ble_mesh_lighting_server_recv_set_msg_t;

/** Context of the received Sensor Status message */
typedef struct {
    struct net_buf_simple *data;    /*!< Value of sensor data state (optional) */
} esp_ble_mesh_server_recv_sensor_status_t;

/**
 * @brief Lighting Server Model received status message union
 */
typedef union {
    esp_ble_mesh_server_recv_sensor_status_t sensor_status;     /*!< Sensor Status */
} esp_ble_mesh_lighting_server_recv_status_msg_t;

/**
 * @brief Lighting Server Model callback value union
 */
typedef union {
    esp_ble_mesh_lighting_server_state_change_t state_change;   /*!< ESP_BLE_MESH_LIGHTING_SERVER_STATE_CHANGE_EVT */
    esp_ble_mesh_lighting_server_recv_get_msg_t get;            /*!< ESP_BLE_MESH_LIGHTING_SERVER_RECV_GET_MSG_EVT */
    esp_ble_mesh_lighting_server_recv_set_msg_t set;            /*!< ESP_BLE_MESH_LIGHTING_SERVER_RECV_SET_MSG_EVT */
    esp_ble_mesh_lighting_server_recv_status_msg_t status;      /*!< ESP_BLE_MESH_LIGHTING_SERVER_RECV_STATUS_MSG_EVT */
} esp_ble_mesh_lighting_server_cb_value_t;

/** Lighting Server Model callback parameters */
typedef struct {
    esp_ble_mesh_model_t  *model;   /*!< Pointer to Lighting Server Models */
    esp_ble_mesh_msg_ctx_t ctx;     /*!< Context of the received messages */
    esp_ble_mesh_lighting_server_cb_value_t value;  /*!< Value of the received Lighting Messages */
} esp_ble_mesh_lighting_server_cb_param_t;

/** This enum value is the event of Lighting Server Model */
typedef enum {
    /**
     * 1. When get_auto_rsp is set to ESP_BLE_MESH_SERVER_AUTO_RSP, no event will be
     *    callback to the application layer when Lighting Get messages are received.
     * 2. When set_auto_rsp is set to ESP_BLE_MESH_SERVER_AUTO_RSP, this event will
     *    be callback to the application layer when Lighting Set/Set Unack messages
     *    are received.
     */
    ESP_BLE_MESH_LIGHTING_SERVER_STATE_CHANGE_EVT,
    /**
     * When get_auto_rsp is set to ESP_BLE_MESH_SERVER_RSP_BY_APP, this event will be
     * callback to the application layer when Lighting Get messages are received.
     */
    ESP_BLE_MESH_LIGHTING_SERVER_RECV_GET_MSG_EVT,
    /**
     * When set_auto_rsp is set to ESP_BLE_MESH_SERVER_RSP_BY_APP, this event will be
     * callback to the application layer when Lighting Set/Set Unack messages are received.
     */
    ESP_BLE_MESH_LIGHTING_SERVER_RECV_SET_MSG_EVT,
    /**
     * When status_auto_rsp is set to ESP_BLE_MESH_SERVER_RSP_BY_APP, this event will
     * be callback to the application layer when Sensor Status message is received.
     */
    ESP_BLE_MESH_LIGHTING_SERVER_RECV_STATUS_MSG_EVT,
    ESP_BLE_MESH_LIGHTING_SERVER_EVT_MAX,
} esp_ble_mesh_lighting_server_cb_event_t;

/**
 *  @brief Bluetooth Mesh Lighting Server Model function.
 */

/**
 * @brief   Lighting Server Model callback function type
 * @param   event: Event type
 * @param   param: Pointer to callback parameter
 */
typedef void (* esp_ble_mesh_lighting_server_cb_t)(esp_ble_mesh_lighting_server_cb_event_t event,
                                                   esp_ble_mesh_lighting_server_cb_param_t *param);

/**
 * @brief       Register BLE Mesh Lighting Server Model callback.
 *
 * @param[in]   callback: Pointer to the callback function.
 *
 * @return      ESP_OK on success or error code otherwise.
 *
 */
esp_err_t esp_ble_mesh_register_lighting_server_callback(esp_ble_mesh_lighting_server_cb_t callback);

#ifdef __cplusplus
}
#endif

#endif /* _ESP_BLE_MESH_LIGHTING_MODEL_API_H_ */

