/*
 *
 *    Copyright (c) 2023 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 <app/ConcreteAttributePath.h>
#include <app/ConcreteCommandPath.h>
#include <thread>
#include <websocket-server/WebSocketServer.h>

class InteractiveServer : public WebSocketServerDelegate
{
public:
    static InteractiveServer & GetInstance();
    void Run(const chip::Optional<uint16_t> port);

    bool Command(const chip::app::ConcreteCommandPath & path);
    bool ReadAttribute(const chip::app::ConcreteAttributePath & path);
    bool WriteAttribute(const chip::app::ConcreteAttributePath & path);
    void CommissioningComplete();

    /////////// WebSocketServerDelegate Interface /////////
    bool OnWebSocketMessageReceived(char * msg) override;

private:
    InteractiveServer(){};
    static InteractiveServer * instance;

    WebSocketServer mWebSocketServer;
    std::thread wsThread;
    bool mIsReady;
};
