/*
 *
 *    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
 *      Objective-C representation of a Status Report from the common profile.
 *
 */

// Note that the choice of namespace alias must be made up front for each and every compile unit
// This is because many include paths could set the default alias to unintended target.
#include <Weave/Profiles/data-management/Legacy/WdmManagedNamespace.h>

#import "NLProfileStatusError.h"
#import "NLWeaveDeviceManager.h"

#include <Weave/Core/WeaveCore.h>
#include <Weave/Profiles/WeaveProfiles.h>
#include <Weave/Profiles/common/CommonProfile.h>
#include <Weave/Profiles/bulk-data-transfer/BulkDataTransfer.h>
#include <Weave/Profiles/service-directory/ServiceDirectory.h>
#include <Weave/Profiles/data-management/DataManagement.h>
#include <Weave/Profiles/device-control/DeviceControl.h>
#include <Weave/Profiles/fabric-provisioning/FabricProvisioning.h>
#include <Weave/Profiles/network-provisioning/NetworkProvisioning.h>
#include <Weave/Profiles/security/WeaveSecurity.h>
#include <Weave/Profiles/software-update/SoftwareUpdateProfile.h>
#include <Weave/Profiles/service-provisioning/ServiceProvisioning.h>

using namespace nl::Weave::Profiles;

@interface NLProfileStatusError () {
    NSString * _statusReport;
}

@end

@implementation NLProfileStatusError

- (id)initWithProfileId:(uint32_t)profileId
             statusCode:(uint16_t)statusCode
              errorCode:(uint32_t)errorCode
           statusReport:(NSString *)statusReport
{
    if (self = [super init]) {
        _profileId = profileId;
        _statusCode = statusCode;
        _errorCode = errorCode;
        _statusReport = statusReport;
    }
    return self;
}

- (NSInteger)translateErrorCode
{
    switch (self.profileId) {

    case nl::Weave::Profiles::kWeaveProfile_BDX:
        switch (self.statusCode) {
        case BulkDataTransfer::kStatus_Overflow:
            return kNLStatus_Overflow;
        case BulkDataTransfer::kStatus_LengthTooShort:
            return kNLStatus_LengthTooShort;
        case BulkDataTransfer::kStatus_XferFailedUnknownErr:
            return kNLStatus_XferFailedUnknownErr;
        case BulkDataTransfer::kStatus_XferMethodNotSupported:
            return kNLStatus_XferMethodNotSupported;
        case BulkDataTransfer::kStatus_UnknownFile:
            return kNLStatus_UnknownFile;
        case BulkDataTransfer::kStatus_StartOffsetNotSupported:
            return kNLStatus_StartOffsetNotSupported;
        case BulkDataTransfer::kStatus_Unknown:
            return kNLStatus_Unknown;
        default:
            return self.statusCode;
        }
        break;

    case nl::Weave::Profiles::kWeaveProfile_Common:
        switch (self.statusCode) {
        case nl::Weave::Profiles::Common::kStatus_Success:
            return kNLStatus_Success;
        case nl::Weave::Profiles::Common::kStatus_BadRequest:
            return kNLStatus_BadRequest;
        case nl::Weave::Profiles::Common::kStatus_UnsupportedMessage:
            return kNLStatus_UnsupportedMessage;
        case nl::Weave::Profiles::Common::kStatus_UnexpectedMessage:
            return kNLStatus_UnexpectedMessage;
        case nl::Weave::Profiles::Common::kStatus_OutOfMemory:
            return kNLStatus_OutOfMemory;
        case nl::Weave::Profiles::Common::kStatus_Relocated:
            return kNLStatus_Relocated;
        case nl::Weave::Profiles::Common::kStatus_Busy:
            return kNLStatus_Busy;
        case nl::Weave::Profiles::Common::kStatus_Timeout:
            return kNLStatus_Timeout;
        case nl::Weave::Profiles::Common::kStatus_InternalError:
            return kNLStatus_InternalError;
        case nl::Weave::Profiles::Common::kStatus_Continue:
            return kNLStatus_Continue;
        case nl::Weave::Profiles::Common::kStatus_AccessDenied:
            return kNLStatus_AccessDenied;
        default:
            return self.statusCode;
        }
        break;

    case nl::Weave::Profiles::kWeaveProfile_WDM:
        switch (self.statusCode) {
        case DataManagement_Legacy::kStatus_InvalidPath:
            return kNLStatus_InvalidPath;
        case DataManagement_Legacy::kStatus_UnknownTopic:
            return kNLStatus_UnknownTopic;
        case DataManagement_Legacy::kStatus_IllegalReadRequest:
            return kNLStatus_IllegalReadRequest;
        case DataManagement_Legacy::kStatus_IllegalWriteRequest:
            return kNLStatus_IllegalWriteRequest;
        default:
            return self.statusCode;
        }
        break;

    case nl::Weave::Profiles::kWeaveProfile_DeviceControl:
        switch (self.statusCode) {
        case DeviceControl::kStatusCode_FailSafeAlreadyActive:
            return kNLStatusCode_FailSafeAlreadyActive;
        case DeviceControl::kStatusCode_NoFailSafeActive:
            return kNLStatusCode_NoFailSafeActive;
        case DeviceControl::kStatusCode_NoMatchingFailSafeActive:
            return kNLStatusCode_NoMatchingFailSafeActive;
        case DeviceControl::kStatusCode_UnsupportedFailSafeMode:
            return kNLStatusCode_UnsupportedFailSafeMode;
        default:
            return self.statusCode;
        }
        break;

    case nl::Weave::Profiles::kWeaveProfile_DeviceDescription:
        switch (self.statusCode) {
        default:
            return self.statusCode;
        }
        break;

    case nl::Weave::Profiles::kWeaveProfile_Echo:
        switch (self.statusCode) {
        default:
            return self.statusCode;
        }
        break;

    case nl::Weave::Profiles::kWeaveProfile_FabricProvisioning:
        switch (self.statusCode) {
        case FabricProvisioning::kStatusCode_AlreadyMemberOfFabric:
            return kNLStatusCode_AlreadyMemberOfFabric;
        case FabricProvisioning::kStatusCode_NotMemberOfFabric:
            return kNLStatusCode_NotMemberOfFabric;
        case FabricProvisioning::kStatusCode_InvalidFabricConfig:
            return kNLStatusCode_InvalidFabricConfig;
        default:
            return self.statusCode;
        }
        break;

    case nl::Weave::Profiles::kWeaveProfile_NetworkProvisioning:
        switch (self.statusCode) {
        case NetworkProvisioning::kStatusCode_UnknownNetwork:
            return kNLStatusCode_UnknownNetwork;
        case NetworkProvisioning::kStatusCode_TooManyNetworks:
            return kNLStatusCode_TooManyNetworks;
        case NetworkProvisioning::kStatusCode_InvalidNetworkConfiguration:
            return kNLStatusCode_InvalidNetworkConfiguration;
        case NetworkProvisioning::kStatusCode_UnsupportedNetworkType:
            return kNLStatusCode_UnsupportedNetworkType;
        case NetworkProvisioning::kStatusCode_UnsupportedWiFiMode:
            return kNLStatusCode_UnsupportedWiFiMode;
        case NetworkProvisioning::kStatusCode_UnsupportedWiFiRole:
            return kNLStatusCode_UnsupportedWiFiRole;
        case NetworkProvisioning::kStatusCode_UnsupportedWiFiSecurityType:
            return kNLStatusCode_UnsupportedWiFiSecurityType;
        case NetworkProvisioning::kStatusCode_InvalidState:
            return kNLStatusCode_InvalidState;
        case NetworkProvisioning::kStatusCode_TestNetworkFailed:
            return kNLStatusCode_TestNetworkFailed;
        default:
            return self.statusCode;
        }
        break;

    case nl::Weave::Profiles::kWeaveProfile_Security:
        switch (self.statusCode) {
        case Security::kStatusCode_SessionAborted:
            return kNLStatusCode_SessionAborted;
        case Security::kStatusCode_PASESupportsOnlyConfig1:
            return kNLStatusCode_PASESupportsOnlyConfig1;
        case Security::kStatusCode_NoCommonPASEConfigurations:
            return kNLStatusCode_NoCommonPASEConfigurations;
        case Security::kStatusCode_UnsupportedEncryptionType:
            return kNLStatusCode_UnsupportedEncryptionType;
        case Security::kStatusCode_InvalidKeyId:
            return kNLStatusCode_InvalidKeyId;
        case Security::kStatusCode_DuplicateKeyId:
            return kNLStatusCode_DuplicateKeyId;
        case Security::kStatusCode_KeyConfirmationFailed:
            return kNLStatusCode_KeyConfirmationFailed;
        case Security::kStatusCode_InternalError:
            return kNLStatusCode_InternalError;
        default:
            return self.statusCode;
        }
        break;

#if WEAVE_CONFIG_ENABLE_SERVICE_DIRECTORY
    case nl::Weave::Profiles::kWeaveProfile_ServiceDirectory:
        switch (self.statusCode) {
        case ServiceDirectory::kStatus_DirectoryUnavailable:
            return kNLStatus_DirectoryUnavailable;
        default:
            return self.statusCode;
        }
        break;
#endif

    case nl::Weave::Profiles::kWeaveProfile_ServiceProvisioning:
        switch (self.statusCode) {
        case ServiceProvisioning::kStatusCode_TooManyServices:
            return kNLStatusCode_TooManyServices;
        case ServiceProvisioning::kStatusCode_ServiceAlreadyRegistered:
            return kNLStatusCode_ServiceAlreadyRegistered;
        case ServiceProvisioning::kStatusCode_InvalidServiceConfig:
            return kNLStatusCode_InvalidServiceConfig;
        case ServiceProvisioning::kStatusCode_NoSuchService:
            return kNLStatusCode_NoSuchService;
        case ServiceProvisioning::kStatusCode_PairingServerError:
            return kNLStatusCode_PairingServerError;
        default:
            return self.statusCode;
        }
        break;

    case nl::Weave::Profiles::kWeaveProfile_SWU:
        switch (self.statusCode) {
        case SoftwareUpdate::kStatus_NoUpdateAvailable:
            return kNLStatus_NoUpdateAvailable;
        case SoftwareUpdate::kStatus_UpdateFailed:
            return kNLStatus_UpdateFailed;
        case SoftwareUpdate::kStatus_InvalidInstructions:
            return kNLStatus_InvalidInstructions;
        case SoftwareUpdate::kStatus_DownloadFailed:
            return kNLStatus_DownloadFailed;
        case SoftwareUpdate::kStatus_IntegrityCheckFailed:
            return kNLStatus_IntegrityCheckFailed;
        case SoftwareUpdate::kStatus_Abort:
            return kNLStatus_Abort;
        case SoftwareUpdate::kStatus_Retry:
            return kNLStatus_Retry;
        default:
            return self.statusCode;
        }
        break;

    case nl::Weave::Profiles::kWeaveProfile_StatusReport_Deprecated:
        switch (self.statusCode) {
        default:
            return self.statusCode;
        }
        break;

    default:
        return self.statusCode;
    }
}

- (NSString *)description
{
    NSString * emptyStatusReport =
        [NSString stringWithFormat:@"No StatusReport available. profileId = %ld, statusCode = %ld, SysErrorCode = %ld",
                  (long) self.profileId, (long) self.statusCode, (long) self.errorCode];

    return _statusReport ? ([NSString stringWithFormat:@"%@, SysErrorCode = %ld", _statusReport, (long) self.errorCode])
                         : emptyStatusReport;
}

@end
