#include <Onboarding/Accounts/AccountsService.h>

#include <ScopedTestAccount.h>

#include <StatusGo/Messenger/Service.h>
#include <StatusGo/Messages/InputMessage.h>
#include <StatusGo/Messages/MessagesApi.h>
#include <StatusGo/Metadata/api_response.h>
#include <StatusGo/SignalsManager.h>

#include <gtest/gtest.h>

namespace fs = std::filesystem;

namespace Status::Testing {

/// This is an integration test to check that status-go doesn't crash on apple silicon when starting Me
/// \warning the test depends on IO and it is not deterministic, fast, focused or reliable. It is here for validation only
/// \todo fin a way to test the integration within a test environment. Also how about reusing an existing account
TEST(MessagingApi, TestStartMessaging)
{
    bool nodeReady = false;
    QObject::connect(
        StatusGo::SignalsManager::instance(), &StatusGo::SignalsManager::nodeReady, [&nodeReady](const QString& error) {
            if(error.isEmpty())
            {
                nodeReady = !nodeReady;
            }
        });

    ScopedTestAccount testAccount(test_info_->name());

    ASSERT_TRUE(StatusGo::Messenger::startMessenger());

    testAccount.processMessages(1000, [nodeReady]() {
        return !nodeReady;
    });
    ASSERT_TRUE(nodeReady);
}

/// Simple test to validate sendChatMessage rpc function. \todo Expand it later.
TEST(MessagingApi, TestSendMessage)
{
    const auto message = StatusGo::Messages::InputMessage::createTextMessage("Hello Status", "someChatId");
    EXPECT_THROW( StatusGo::Messages::sendMessage(message), StatusGo::CallPrivateRpcError );
}

} // namespace