/*
 *
 *    Copyright (c) 2020 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.
 */

/**
 *    @file
 *      The defines constants for the CHIP Secure Channel Protocol, present in
 *      every CHIP device.
 *
 */

#pragma once

#include <array>
#include <lib/support/CodeUtils.h>
#include <protocols/Protocols.h>

/**
 *   @namespace chip::Protocols::SecureChannel
 *
 *   @brief
 *     This namespace includes all interfaces within CHIP for the
 *     CHIP SecureChannel protocol.
 *
 *     The interfaces define message types and status codes.
 */

namespace chip {
namespace Protocols {
namespace SecureChannel {

constexpr const char * kProtocolName = "SecureChannel";

/**
 * SecureChannel Protocol Message Types
 */
enum class MsgType : uint8_t
{
    // Message Counter Synchronization Protocol Message Types
    MsgCounterSyncReq = 0x00,
    MsgCounterSyncRsp = 0x01,

    // Reliable Messaging Protocol Message Types
    StandaloneAck = 0x10,

    // Password-based session establishment Message Types
    PBKDFParamRequest  = 0x20,
    PBKDFParamResponse = 0x21,
    PASE_Pake1         = 0x22,
    PASE_Pake2         = 0x23,
    PASE_Pake3         = 0x24,

    // Certificate-based session establishment Message Types
    CASE_Sigma1       = 0x30,
    CASE_Sigma2       = 0x31,
    CASE_Sigma3       = 0x32,
    CASE_Sigma2Resume = 0x33,

    StatusReport = 0x40,
};

// Placeholder value for the ProtocolCode field when the GeneralCode is Success or Continue.
constexpr uint16_t kProtocolCodeSuccess         = 0x0000;
constexpr uint16_t kProtocolCodeNoSharedRoot    = 0x0001;
constexpr uint16_t kProtocolCodeInvalidParam    = 0x0002;
constexpr uint16_t kProtocolCodeCloseSession    = 0x0003;
constexpr uint16_t kProtocolCodeBusy            = 0x0004;
constexpr uint16_t kProtocolCodeSessionNotFound = 0x0005;

// Placeholder value for the ProtocolCode field when there is no additional protocol-specific code to provide more information.
constexpr uint16_t kProtocolCodeGeneralFailure = 0xFFFF;

/**
 * Status Report - General Status Codes used to convey protocol-agnostic status info.
 */
enum class GeneralStatusCode : uint16_t
{
    kSuccess           = 0,  /**< Operation completed successfully. */
    kFailure           = 1,  /**< Generic failure, additional details may be included in the protocol specific status. */
    kBadPrecondition   = 2,  /**< Operation was rejected by the system because the system is in an invalid state. */
    kOutOfRange        = 3,  /**< A value was out of a required range. */
    kBadRequest        = 4,  /**< A request was unrecognized or malformed. */
    kUnsupported       = 5,  /**< An unrecognized or unsupported request was received. */
    kUnexpected        = 6,  /**< A request was not expected at this time. */
    kResourceExhausted = 7,  /**< Insufficient resources to process the given request. */
    kBusy              = 8,  /**< Device is busy and cannot handle this request at this time. */
    kTimeout           = 9,  /**< A timeout occurred. */
    kContinue          = 10, /**< Context-specific signal to proceed. */
    kAborted           = 11, /**< Failure, often due to a concurrency error. */
    kInvalidArgument   = 12, /**< An invalid/unsupported argument was provided. */
    kNotFound          = 13, /**< Some requested entity was not found. */
    kAlreadyExists     = 14, /**< The caller attempted to create something that already exists. */
    kPermissionDenied  = 15, /**< Caller does not have sufficient permissions to execute the requested operations. */
    kDataLoss          = 16, /**< Unrecoverable data loss or corruption has occurred. */
};

/**
 * Status Report - Status Codes specific only to the SecureChannel Protocol
 */
enum class StatusCode
{
    AlreadyMemberOfFabric = 1, /**< The recipient is already a member of a fabric. */
    NotMemberOfFabric     = 2, /**< The recipient is not a member of a fabric. */
    InvalidFabricConfig   = 3  /**< The specified fabric configuration was invalid. */
};

} // namespace SecureChannel

template <>
struct MessageTypeTraits<SecureChannel::MsgType>
{
    static constexpr const Protocols::Id & ProtocolId() { return SecureChannel::Id; }

    static auto GetTypeToNameTable()
    {
        static const std::array<MessageTypeNameLookup, 13> typeToNameTable = {
            {
                { SecureChannel::MsgType::MsgCounterSyncReq, "MsgCounterSyncReq" },
                { SecureChannel::MsgType::MsgCounterSyncRsp, "MsgCounterSyncRsp" },
                { SecureChannel::MsgType::StandaloneAck, "StandaloneAck" },
                { SecureChannel::MsgType::PBKDFParamRequest, "PBKDFParamRequest" },
                { SecureChannel::MsgType::PBKDFParamResponse, "PBKDFParamResponse" },
                { SecureChannel::MsgType::PASE_Pake1, "PASE_Pake1" },
                { SecureChannel::MsgType::PASE_Pake2, "PASE_Pake2" },
                { SecureChannel::MsgType::PASE_Pake3, "PASE_Pake3" },
                { SecureChannel::MsgType::CASE_Sigma1, "CASE_Sigma1" },
                { SecureChannel::MsgType::CASE_Sigma2, "CASE_Sigma2" },
                { SecureChannel::MsgType::CASE_Sigma3, "CASE_Sigma3" },
                { SecureChannel::MsgType::CASE_Sigma2Resume, "CASE_Sigma2Resume" },
                { SecureChannel::MsgType::StatusReport, "StatusReport" },
            },
        };

        return &typeToNameTable;
    }
};

} // namespace Protocols
} // namespace chip
