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

#pragma once

#include "Types.h"

namespace matter {
namespace casting {
namespace core {

/**
 * @brief React to the Commissioner's CommissionerDeclaration messages with this singleton.
 */
class CommissionerDeclarationHandler : public chip::Protocols::UserDirectedCommissioning::CommissionerDeclarationHandler
{
public:
    CommissionerDeclarationHandler(const CommissionerDeclarationHandler &) = delete;
    void operator=(const CommissionerDeclarationHandler &)                 = delete;

    static CommissionerDeclarationHandler * GetInstance();

    void OnCommissionerDeclarationMessage(const chip::Transport::PeerAddress & source,
                                          chip::Protocols::UserDirectedCommissioning::CommissionerDeclaration cd) override;

private:
    static CommissionerDeclarationHandler * sCommissionerDeclarationHandler_;
    CommissionerDeclarationHandler() {}
    ~CommissionerDeclarationHandler() {}
};

}; // namespace core
}; // namespace casting
}; // namespace matter
