/*
 *
 *    Copyright (c) 2013-2017 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

/**
 *    @file
 *      Constants and enums for bringing the Weave constants into Objective C
 *
 */

#import <Foundation/Foundation.h>

#ifndef __NLWEAVEDEVICEMANAGERTYPES_H__
#define __NLWEAVEDEVICEMANAGERTYPES_H__

// Because there doesn't seem to be a very easy way to bring over C++ types nested inside namespaces
// into our pure Objective-C project

// Network Type
//
typedef NS_ENUM(NSInteger, NLNetworkType)
{
    kNLNetworkType_NotSpecified                     = -1,

    kNLNetworkType_WiFi                             = 1,
    kNLNetworkType_Thread                           = 2

};


// WiFi Operating Modes
//
typedef NS_ENUM(NSInteger, NLWiFiMode)
{
    kNLWiFiMode_NotSpecified                        = -1,

    kNLWiFiMode_AdHoc                               = 1,
    kNLWiFiMode_Managed                             = 2
};


// Device WiFi Role
//
typedef NS_ENUM(NSInteger, NLWiFiRole)
{
    kNLWiFiRole_NotSpecified                        = -1,

    kNLWiFiRole_Station                             = 1,
    kNLWiFiRole_AccessPoint                         = 2
};


// Rendezvous Mode Flags
//
typedef NS_ENUM(NSInteger, NLRendezvousModeFlags)
{
    kNLRendezvousMode_EnableWiFiRendezvousNetwork   = 0x0001,
    kNLRendezvousMode_Enable802154RendezvousNetwork = 0x0002,
    kNLRendezvousMode_EnableFabricRendezvousAddress = 0x0004
};

// Get Network Flags
//
typedef NS_ENUM(NSInteger, NLGetNetworkFlags)
{
    kNLGetNetwork_IncludeCredentials                = 0x01
};

// WiFi Security Modes
//
typedef NS_ENUM(NSInteger, NLWiFiSecurityType)
{
    kNLWiFiSecurityType_NotSpecified                = -1,

    kNLWiFiSecurityType_None                        = 1,
    kNLWiFiSecurityType_WEP                         = 2,
    kNLWiFiSecurityType_WPAPersonal                 = 3,
    kNLWiFiSecurityType_WPA2Personal                = 4,
    kNLWiFiSecurityType_WPA2MixedPersonal           = 5,
    kNLWiFiSecurityType_WPAEnterprise               = 6,
    kNLWiFiSecurityType_WPA2Enterprise              = 7,
    kNLWiFiSecurityType_WPA2MixedEnterprise         = 8
};

// Device Descriptor
//
typedef struct NLManufacturingDate
{
    NSInteger NLManufacturingDateYear;
    NSInteger NLManufacturingDateMonth;
    NSInteger NLManufacturingDateDay;
} NLManufacturingDate;


typedef NS_ENUM(NSInteger, NLWeaveRequestError)
{
    NLWeaveRequestError_ProfileStatusError          = 1,
    NLWeaveRequestError_WeaveError                  = 2,
    NLWeaveRequestError_UnknownError,

};


typedef NS_ENUM(NSInteger, NLWeaveVendorId)
{
    kNLWeaveVendor_Any                                = 0xFFFF,
    kNLWeaveVendor_Core                               = 0x0000,
    kNLWeaveVendor_NestLabs                           = 0x235A,
    kNLWeaveVendor_Yale                               = 0xE727
};

//
// Nest Labs Weave Product Identifiers (16 bits max)
//

typedef NS_ENUM(NSInteger, NestWeaveProductId)
{
    kNestWeaveProduct_NotSpecified               = -1,
    kNestWeaveProduct_Diamond                    = 0x0001,
    kNestWeaveProduct_DiamondBackplate           = 0x0002,
    kNestWeaveProduct_Diamond2                   = 0x0003,
    kNestWeaveProduct_Diamond2Backplate          = 0x0004,
    kNestWeaveProduct_Topaz                      = 0x0005,
    kNestWeaveProduct_AmberBackplate             = 0x0006,
    kNestWeaveProduct_Amber                      = 0x0007,  // DEPRECATED -- Use kNestWeaveProduct_AmberHeatLink
    kNestWeaveProduct_AmberHeatLink              = 0x0007,
    kNestWeaveProduct_Pinna                      = 0x0008,
    kNestWeaveProduct_Topaz2                     = 0x0009,
    kNestWeaveProduct_Diamond3                   = 0x000A,
    kNestWeaveProduct_Diamond3Backplate          = 0x000B,
    kNestWeaveProduct_Flintstone                 = 0x000C,
    kNestWeaveProduct_Quartz                     = 0x000D,
    kNestWeaveProduct_Keshi                      = 0x000E,
    kNestWeaveProduct_Amber2HeatLink             = 0x000F,
    kNestWeaveProduct_SmokyQuartz                = 0x0010,
    kNestWeaveProduct_Quartz2                    = 0x0011,
    kNestWeaveProduct_BlackQuartz                = 0x0012,
    kNestWeaveProduct_Nevis                      = 0x0013,
    kNestWeaveProduct_Onyx                       = 0x0014,
    kNestWeaveProduct_OnyxBackplate              = 0x0015,
    kNestWeaveProduct_Antigua                    = 0x0016,
    kNestWeaveProduct_RoseQuartz                 = 0x0017,
    kNestWeaveProduct_Moonstone                  = 0x0018,
    kNestWeaveProduct_Kryptonite                 = 0x001A
};

//
// Weave Profile Ids (32-bits max)
//

typedef NS_ENUM(NSInteger, NLWeaveProfileId)
{
    // Core profiles
    kWeaveProfile_Common                            = (kNLWeaveVendor_Core << 16) | 0x0000,
    kWeaveProfile_Echo                              = (kNLWeaveVendor_Core << 16) | 0x0001,           // Echo Profile
    kWeaveProfile_StatusReport_Deprecated           = (kNLWeaveVendor_Core << 16) | 0x0002,           // Status Report Profile
    kWeaveProfile_NetworkProvisioning               = (kNLWeaveVendor_Core << 16) | 0x0003,           // Network Provisioning Profile
    kWeaveProfile_Security                          = (kNLWeaveVendor_Core << 16) | 0x0004,           // Network Security Profile
    kWeaveProfile_FabricProvisioning                = (kNLWeaveVendor_Core << 16) | 0x0005,           // Fabric Provisioning Profile
    kWeaveProfile_DeviceControl                     = (kNLWeaveVendor_Core << 16) | 0x0006,           // Device Control Profile
    kWeaveProfile_WDM                               = (kNLWeaveVendor_Core << 16) | 0x000B,           // Data Management Profile
    kWeaveProfile_SWU                               = (kNLWeaveVendor_Core << 16) | 0x000C,           // Software Update Profile
    kWeaveProfile_BDX                               = (kNLWeaveVendor_Core << 16) | 0x000D,           // Bulk Data Transfer Profile
    kWeaveProfile_DeviceDescription                 = (kNLWeaveVendor_Core << 16) | 0x000E,           // Weave Device Description Profile
    kWeaveProfile_ServiceProvisioning               = (kNLWeaveVendor_Core << 16) | 0x000F,           // Service Provisioning Profile
    kWeaveProfile_ServiceDirectory                  = (kNLWeaveVendor_Core << 16) | 0x0010,           // Service Directory Profile

    // Nest Labs profiles
    kWeaveProfile_Occupancy                         = (kNLWeaveVendor_NestLabs << 16) | 0x0001,       // Weave Occupancy profile
    kWeaveProfile_Structure                         = (kNLWeaveVendor_NestLabs << 16) | 0x0002,       // Weave Structure profile
    kWeaveProfile_NestProtect                       = (kNLWeaveVendor_NestLabs << 16) | 0x0003,       // Weave Topaz profile
    kWeaveProfile_TimeVariantData                   = (kNLWeaveVendor_NestLabs << 16) | 0x0004,       // Weave TVD profile
    kWeaveProfile_Alarm                             = (kNLWeaveVendor_NestLabs << 16) | 0x0006,       // Weave Alarm profile
};

//
// Alarm Update Status Codes
//
typedef NS_ENUM(NSInteger, NLAlarmUpdateStatus) {
    kNLAlarmUpdateStatus_Success                    = 0,
    kNLAlarmUpdateStatus_Rejected                   = 1,
    kNLAlarmUpdateStatus_Invalid                    = 2,
    kNLAlarmUpdateStatus_Timeout                    = 3
};

//
// status/error codes for BDX
//
typedef NS_ENUM(NSInteger, NLBDXStatus) {
    kNLStatus_Overflow                              = 0x0011,
    kNLStatus_LengthTooShort                        = 0x0013,
    kNLStatus_XferFailedUnknownErr                  = 0x001F,
    kNLStatus_XferMethodNotSupported                = 0x0050,
    kNLStatus_UnknownFile                           = 0x0051,
    kNLStatus_StartOffsetNotSupported               = 0x0052,
    kNLStatus_Unknown                               = 0x005F,
};


// Common Profile Status Codes
//
typedef NS_ENUM(NSInteger, NLCommonProfileStatus)
{
    kNLStatus_Success                               = 0,                    // The operation completed without error.

    kNLStatus_BadRequest                            = 0x0010,               // The request was unrecognized or malformed.
    kNLStatus_UnsupportedMessage                    = 0x0011,               // An unrecognized or unsupported message was received.
    kNLStatus_UnexpectedMessage                     = 0x0012,               // A message was received at an unexpected time or in an unexpected context.
    kNLStatus_OutOfMemory                           = 0x0017,               // Out of memory

    kNLStatus_Relocated                             = 0x0030,               // Request could not be completed because it was made to the wrong endpoint.
                                                                            // Client should query its directory server for an updated endpoint list and try again.

    kNLStatus_Busy                                  = 0x0040,               // The current state of the sender prevents the operation from being performed.
    kNLStatus_Timeout                               = 0x0041,               // The operation or protocol interaction failed to complete in the allotted time.

    kNLStatus_InternalError                         = 0x0050,               // An internal failure prevented an operation from completing.

    kNLStatus_Continue                              = 0x0090,               // Context-specific signal to proceed.
};

// Data Management Status Codes
//
typedef NS_ENUM(NSInteger, NLDataManagementStatus)
{
    kNLStatus_InvalidPath                           = 0x0013,               // A path from the path list of a view or update request frame
                                                                            // did not match the node-resident schema of the responder.

    kNLStatus_UnknownTopic                          = 0x0014,               // The topic given in a cancel request did not match any
                                                                            // subscription extant on the receiving node.

    kNLStatus_IllegalReadRequest                    = 0x0015,               // The node making a request to read a particular data item does
                                                                            // not have permission to do so.

    kNLStatus_IllegalWriteRequest                   = 0x0016,               // The node making a request to write a particular data item does
                                                                            // not have permission to do so.
};

// Device Control Status Codes
//
typedef NS_ENUM(NSInteger, NLDeviceControlStatus)
{
    kNLStatusCode_FailSafeAlreadyActive             = 1,                    // A fail-safe is already active.
    kNLStatusCode_NoFailSafeActive                  = 2,                    // No fail-safe is active.
    kNLStatusCode_NoMatchingFailSafeActive          = 3,                    // The fail-safe token did not match the active fail-safe.
    kNLStatusCode_UnsupportedFailSafeMode           = 4                     // The specified fail-safe mode is not supported by the device.
};


// Fabric Provisioning Status Codes
//
typedef NS_ENUM(NSInteger, NLFabricProvisioningStatus)
{
    kNLStatusCode_AlreadyMemberOfFabric             = 1,                    // The recipient is already a member of a fabric.
    kNLStatusCode_NotMemberOfFabric                 = 2,                    // The recipient is not a member of a fabric.
    kNLStatusCode_InvalidFabricConfig               = 3                     // The specified fabric configuration was invalid.
};


// Network Provisioning Status Codes
//
typedef NS_ENUM(NSInteger, NLNetworkProvisioningStatus)
{
    kNLStatusCode_UnknownNetwork                    = 1,
    kNLStatusCode_TooManyNetworks                   = 2,
    kNLStatusCode_InvalidNetworkConfiguration       = 3,
    kNLStatusCode_UnsupportedNetworkType            = 4,
    kNLStatusCode_UnsupportedWiFiMode               = 5,
    kNLStatusCode_UnsupportedWiFiRole               = 6,
    kNLStatusCode_UnsupportedWiFiSecurityType       = 7,
    kNLStatusCode_InvalidState                      = 8,
    kNLStatusCode_TestNetworkFailed                 = 9,                    // XXX Placeholder for more detailed errors to come before we ship 1.0
};


// Weave Security Status Codes
//
typedef NS_ENUM(NSInteger, NLWeaveSecurityStatus)
{
    kNLStatusCode_SessionAborted                    = 1,                    // The sender has aborted the session establishment process.
    kNLStatusCode_PASESupportsOnlyConfig1           = 2,                    // PASE only supoprts Config1.
    kNLStatusCode_UnsupportedEncryptionType         = 3,                    // The requested encryption type is not support.
    kNLStatusCode_InvalidKeyId                      = 4,                    // An invalid key id was requested.
    kNLStatusCode_DuplicateKeyId                    = 5,                    // The specified key id is already in use.
    kNLStatusCode_KeyConfirmationFailed             = 6,                    // The derived session keys do not agree.
    kNLStatusCode_InternalError                     = 7,                    // The sender encounters an internal error (e.g. no memory, etc...).
    kNLStatusCode_AuthenitcationFailed              = 8,                    // The sender rejected the authentication attempt.
    kNLStatusCode_NoCommonPASEConfigurations        = 9                     // No supported PASE configurations in common.
};

// Service Directory status codes
typedef NS_ENUM(NSInteger, NLServiceDirectoryStatus) {
    kNLStatus_DirectoryUnavailable                  = 0x0051
};


// Service Provisioning Status Codes
//
typedef NS_ENUM(NSInteger, NLServiceProvisioningStatus)
{
    kNLStatusCode_TooManyServices                   = 1,                    // There are too many service's registered on the device.
    kNLStatusCode_ServiceAlreadyRegistered          = 2,                    // The specified service is already registered on the device.
    kNLStatusCode_InvalidServiceConfig              = 3,                    // The specified service configuration is invalid.
    kNLStatusCode_NoSuchService                     = 4,                    // The specified id does not match a service registered on the device.
    kNLStatusCode_PairingServerError                = 5                     // The device could not complete service pairing because it failed to talk to the pairing server.
};


//
// Software Update
//
typedef NS_ENUM(NSInteger, NLSoftwareUpdateStatus) {
    kNLStatus_NoUpdateAvailable                     = 0x0001,
    kNLStatus_UpdateFailed                          = 0x0010,
    kNLStatus_InvalidInstructions                   = 0x0050,
    kNLStatus_DownloadFailed                        = 0x0051,
    kNLStatus_IntegrityCheckFailed                  = 0x0052,
    kNLStatus_Abort                                 = 0x0053,
    kNLStatus_Retry                                 = 0x0091,
};


//
// Fail Safe modes
//
typedef NS_ENUM(NSInteger, NLFailSafeMode) {
    kFailSafeModeUndefined                          = 0,
    kFailSafeModeNew                                = 1,
    kFailSafeModeReset,
    kFailSafeModeResume,
};


// Special target fabric ids
typedef NS_ENUM(uint64_t, NLTargetFabricIds)
{
    NLTargetFabricId_NotInFabric                   = 0,                    // Specifies that only devices that are NOT a member of a fabric should respond.
    NLTargetFabricId_AnyFabric                     = 0xFFFFFFFFFFFFFF00ULL,// Specifies that only devices that ARE a member of a fabric should respond.
    NLTargetFabricId_Any                           = 0xFFFFFFFFFFFFFFFFULL,// Specifies that all devices should respond regardless of fabric membership.
};

// Special node id values.
typedef NS_ENUM(uint64_t, NLTargetDeviceIds)
{
    NLTargetDeviceId_NotSpecified                  = 0ULL,                 // Node Id is not specified
    NLTargetDeviceId_AnyNodeId                     = 0xFFFFFFFFFFFFFFFFULL,// Any node id is accepted
};

typedef NS_ENUM(NSInteger, NLTargetDeviceModes) {
    NLTargetDeviceModeAny                         = 0,                      // Locate all devices regardless of mode.

    NLTargetDeviceModeUserSelectedMode            = 1,                      // Locate all devices in 'user-selected' mode -- i.e. where the device has has been
                                                                            // directly identified by a user, e.g. by pressing a button.
};

typedef enum NLDeviceFeatures {
    kNLDeviceFeatureNone                           = 0x0000,
    kNLDeviceFeature_LinePowered                   = 0x0002,                 // Indicates a device that requires line power.
} NLDeviceFeatures;

typedef NS_ENUM(NSInteger, NLProductWildcardId) {
    NLProductWildcardId_NestThermostat             = 0xFFF0,
    NLProductWildcardId_NestProtect                = 0xFFF1,
    NLProductWildcardId_NestCam                    = 0xFFF2,
};

/// @enum NLWeaveAlarmState
/// This is the same as constants defined in WeaveAlaram.h
typedef NS_ENUM(uint8_t, NLWeaveAlarmState) {
    NLWeaveAlarmState_StandBy                       = 0x00,
    NLWeaveAlarmState_Heads_Up_1                    = 0x01,
    NLWeaveAlarmState_Heads_Up_2                    = 0x02,
    NLWeaveAlarmState_HU_Hush                       = 0x03,
    NLWeaveAlarmState_Alarm_Hushable                = 0x04,
    NLWeaveAlarmState_Alarm_Non_Hushable            = 0x05,
    NLWeaveAlarmState_Alarm_Global_Hush             = 0x06,
    NLWeaveAlarmState_Alarm_Remote_Hush             = 0x07,
    NLWeaveAlarmState_Self_Test                     = 0x08,
    NLWeaveAlarmState_Announce_Heads_Up_1           = 0x09,
    NLWeaveAlarmState_Announce_Heads_Up_2           = 0x0A,
    NLWeaveAlarmState_Invalid                       = 0xFF,
};

/// @enum NLWeaveAlarmSource
/// This is the same as constants defined in WeaveAlaram.h
typedef NS_ENUM(uint8_t, NLWeaveAlarmSource) {
    NLWeaveAlarmSource_Smoke        = 0x10,
    NLWeaveAlarmSource_Temp         = 0x20,
    NLWeaveAlarmSource_CO           = 0x30,
    NLWeaveAlarmSource_CH4          = 0x40,
    NLWeaveAlarmSource_Humidity     = 0x50,
    NLWeaveAlarmSource_Other        = 0xF0,
    NLWeaveAlarmSource_Invalid      = 0xFF,
};

/// @enum NLWeaveHushResult
/// This is the same as constants defined in WeaveAlaram.h
typedef NS_ENUM(uint8_t, NLWeaveHushResult) {
    NLWeaveHushResult_Success       = 0,
};

/// @enum NLWeaveHushResult
/// This is the same as constants defined in WeaveAlaram.h
typedef NS_ENUM(uint16_t, NLWeaveKeyId) {
    NLWeaveKeyId_None               = 0,
    NLWeaveKeyId_StructureHushKey   = 0x0002,
};

/// @enum NLWeaveHushResult
/// This is the same as constants defined in WeaveAlaram.h
typedef NS_ENUM(uint16_t, NLWeaveNestProtectSystemTestId) {
    NLWeaveNestProtectSystemTestId_Unknown          = 0,
    NLWeaveNestProtectSystemTestId_ManualSelfTest   = 1,
};

#endif // __NLWEAVEDEVICEMANAGERTYPES_H__
