/*
 *
 *    Copyright (c) 2021 Project CHIP Authors
 *    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.
 */

#include <controller/CommissioningDelegate.h>

namespace chip {
namespace Controller {

const char * StageToString(CommissioningStage stage)
{
    switch (stage)
    {
    case kError:
        return "Error";

    case kSecurePairing:
        return "SecurePairing";

    case kReadCommissioningInfo:
        return "ReadCommissioningInfo";

    case kArmFailsafe:
        return "ArmFailSafe";

    case kScanNetworks:
        return "ScanNetworks";

    case kConfigRegulatory:
        return "ConfigRegulatory";

    case kConfigureTCAcknowledgments:
        return "ConfigureTCAcknowledgments";

    case kConfigureUTCTime:
        return "ConfigureUTCTime";

    case kConfigureTimeZone:
        return "ConfigureTimeZone";

    case kConfigureDSTOffset:
        return "ConfigureDSTOffset";

    case kConfigureDefaultNTP:
        return "ConfigureDefaultNTP";

    case kSendPAICertificateRequest:
        return "SendPAICertificateRequest";

    case kSendDACCertificateRequest:
        return "SendDACCertificateRequest";

    case kSendAttestationRequest:
        return "SendAttestationRequest";

    case kAttestationVerification:
        return "AttestationVerification";

    case kAttestationRevocationCheck:
        return "AttestationRevocationCheck";
#if CHIP_DEVICE_CONFIG_ENABLE_JOINT_FABRIC
    case kJCMTrustVerification:
        return "JCMTrustVerification";
#endif // CHIP_DEVICE_CONFIG_ENABLE_JOINT_FABRIC
    case kSendOpCertSigningRequest:
        return "SendOpCertSigningRequest";

    case kValidateCSR:
        return "ValidateCSR";

    case kGenerateNOCChain:
        return "GenerateNOCChain";

    case kSendTrustedRootCert:
        return "SendTrustedRootCert";

    case kSendNOC:
        return "SendNOC";

    case kConfigureTrustedTimeSource:
        return "ConfigureTrustedTimeSource";

    case kICDGetRegistrationInfo:
        return "ICDGetRegistrationInfo";

    case kICDRegistration:
        return "ICDRegistration";

    case kWiFiNetworkSetup:
        return "WiFiNetworkSetup";

    case kThreadNetworkSetup:
        return "ThreadNetworkSetup";

    case kFailsafeBeforeWiFiEnable:
        return "FailsafeBeforeWiFiEnable";

    case kFailsafeBeforeThreadEnable:
        return "FailsafeBeforeThreadEnable";

    case kWiFiNetworkEnable:
        return "WiFiNetworkEnable";

    case kThreadNetworkEnable:
        return "ThreadNetworkEnable";

    case kEvictPreviousCaseSessions:
        return "EvictPreviousCaseSessions";

    case kFindOperationalForStayActive:
        return "FindOperationalForStayActive";

    case kFindOperationalForCommissioningComplete:
        return "FindOperationalForCommissioningComplete";

    case kICDSendStayActive:
        return "ICDSendStayActive";

    case kSendComplete:
        return "SendComplete";

    case kCleanup:
        return "Cleanup";

    case kNeedsNetworkCreds:
        return "NeedsNetworkCreds";

    case kPrimaryOperationalNetworkFailed:
        return "PrimaryOperationalNetworkFailed";

    case kRemoveWiFiNetworkConfig:
        return "RemoveWiFiNetworkConfig";

    case kRemoveThreadNetworkConfig:
        return "RemoveThreadNetworkConfig";

    case kRequestWiFiCredentials:
        return "RequestWiFiCredentials";

    case kRequestThreadCredentials:
        return "RequestThreadCredentials";

#if CHIP_DEVICE_CONFIG_ENABLE_NFC_BASED_COMMISSIONING
    case kUnpoweredPhaseComplete:
        return "UnpoweredPhaseComplete";
#endif

    default:
        return "???";
    }
}

#if MATTER_TRACING_ENABLED
const char * MetricKeyForCommissioningStage(CommissioningStage stage)
{
    switch (stage)
    {
    case kError:
        return "core_commissioning_stage_error";

    case kSecurePairing:
        return "core_commissioning_stage_secure_pairing";

    case kReadCommissioningInfo:
        return "core_commissioning_stage_read_commissioning_info";

    case kArmFailsafe:
        return "core_commissioning_stage_arm_failsafe";

    case kScanNetworks:
        return "core_commissioning_stage_scan_networks";

    case kConfigRegulatory:
        return "core_commissioning_stage_config_regulatory";

    case kConfigureUTCTime:
        return "core_commissioning_stage_configure_utc_time";

    case kConfigureTimeZone:
        return "core_commissioning_stage_configure_timezone";

    case kConfigureDSTOffset:
        return "core_commissioning_stage_configure_dst_offset";

    case kConfigureDefaultNTP:
        return "core_commissioning_stage_configure_default_ntp";

    case kSendPAICertificateRequest:
        return "core_commissioning_stage_send_pai_certificate_request";

    case kSendDACCertificateRequest:
        return "core_commissioning_stage_send_dac_certificate_request";

    case kSendAttestationRequest:
        return "core_commissioning_stage_send_attestation_request";

    case kAttestationVerification:
        return "core_commissioning_stage_attestation_verification";

    case kSendOpCertSigningRequest:
        return "core_commissioning_stage_opcert_signing_request";

    case kValidateCSR:
        return "core_commissioning_stage_validate_csr";

    case kGenerateNOCChain:
        return "core_commissioning_stage_generate_noc_chain";

    case kSendTrustedRootCert:
        return "core_commissioning_stage_send_trusted_root_cert";

    case kSendNOC:
        return "core_commissioning_stage_send_noc";

    case kConfigureTrustedTimeSource:
        return "core_commissioning_stage_configure_trusted_time_source";

    case kICDGetRegistrationInfo:
        return "core_commissioning_stage_icd_get_registration_info";

    case kICDRegistration:
        return "core_commissioning_stage_icd_registration";

    case kWiFiNetworkSetup:
        return "core_commissioning_stage_wifi_network_setup";

    case kThreadNetworkSetup:
        return "core_commissioning_stage_thread_network_setup";

    case kFailsafeBeforeWiFiEnable:
        return "core_commissioning_stage_failsafe_before_wifi_enable";

    case kFailsafeBeforeThreadEnable:
        return "core_commissioning_stage_failsafe_before_thread_enable";

    case kWiFiNetworkEnable:
        return "core_commissioning_stage_wifi_network_enable";

    case kThreadNetworkEnable:
        return "core_commissioning_stage_thread_network_enable";

    case kEvictPreviousCaseSessions:
        return "core_commissioning_stage_evict_previous_case_sessions";

    case kFindOperationalForStayActive:
        return "core_commissioning_stage_find_operational_for_stay_active";

    case kFindOperationalForCommissioningComplete:
        return "core_commissioning_stage_find_operational_for_commissioning_complete";

    case kICDSendStayActive:
        return "core_commissioning_stage_icd_send_stay_active";

    case kSendComplete:
        return "core_commissioning_stage_send_complete";

    case kCleanup:
        return "core_commissioning_stage_cleanup";

    case kNeedsNetworkCreds:
        return "core_commissioning_stage_need_network_creds";

#if CHIP_DEVICE_CONFIG_ENABLE_NFC_BASED_COMMISSIONING
    case kUnpoweredPhaseComplete:
        return "core_commissioning_stage_unpowered_phase";
#endif

    default:
        return "core_commissioning_stage_unknown";
    }
}
#endif

} // namespace Controller
} // namespace chip
