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

/**
 *  @file
 *    This file contains definitions for DeviceProxy base class. The objects of this
 *    class will be used by applications to interact with peer CHIP devices.
 *    The class provides mechanism to construct, send and receive messages to and
 *    from the corresponding CHIP devices.
 */

#pragma once

#include <app/CommandSender.h>
#include <lib/core/CHIPCallback.h>
#include <lib/core/CHIPCore.h>
#include <lib/support/DLLUtil.h>

namespace chip {

class DLL_EXPORT DeviceProxy
{
public:
    virtual ~DeviceProxy() {}
    DeviceProxy() {}

    /**
     *  Mark any open session with the device as expired.
     */
    virtual void Disconnect() = 0;

    virtual NodeId GetDeviceId() const = 0;

    virtual void ShutdownSubscriptions() = 0;

    virtual CHIP_ERROR SendCommands(app::CommandSender * commandObj, chip::Optional<System::Clock::Timeout> timeout = NullOptional);

    virtual Messaging::ExchangeManager * GetExchangeManager() const = 0;

    virtual chip::Optional<SessionHandle> GetSecureSession() const = 0;

    virtual CHIP_ERROR SetPeerId(ByteSpan rcac, ByteSpan noc) { return CHIP_ERROR_NOT_IMPLEMENTED; }

    const ReliableMessageProtocolConfig & GetRemoteMRPConfig() const { return mRemoteMRPConfig; }

    /**
     * @brief
     *   This function returns the attestation challenge for the secure session.
     *
     * @param[out] attestationChallenge The output for the attestationChallenge
     *
     * @return CHIP_ERROR               CHIP_NO_ERROR on success, or CHIP_ERROR_INVALID_ARGUMENT if no secure session is active
     */
    virtual CHIP_ERROR GetAttestationChallenge(ByteSpan & attestationChallenge);

protected:
    virtual bool IsSecureConnected() const = 0;

    ReliableMessageProtocolConfig mRemoteMRPConfig = GetDefaultMRPConfig();
};

} // namespace chip
