/*
 *
 *    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>
#import "NLWeaveErrorCodes.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 WirelessOperatingLocation
//
typedef NS_ENUM(NSInteger, NLWirelessOperatingLocation) {
    kNLWirelessOperatingLocation_NotSpecified = 0x00,
    kNLWirelessOperatingLocation_Unknown = 0x01,
    kNLWirelessOperatingLocation_Indoors = 0x02,
    kNLWirelessOperatingLocation_Outdoors = 0x03
};

// 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,
    kNLWiFiSecurityType_WPA3Personal = 9,
    kNLWiFiSecurityType_WPA3MixedPersonal = 10,
    kNLWiFiSecurityType_WPA3Enterprise = 11,
    kNLWiFiSecurityType_WPA3MixedEnterprise = 12
};

// 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
};

//
// 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
};

//
// 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_AccessDenied = 0x0014, // The device is paired to another account.
    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 services 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,
};

#endif // __NLWEAVEDEVICEMANAGERTYPES_H__
