/*******************************************************************

Part of the Fritzing project - http://fritzing.org
Copyright (c) 2023 Fritzing GmbH

Fritzing is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Fritzing is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Fritzing.  If not, see <http://www.gnu.org/licenses/>.

********************************************************************/

#include "fabuploadprogressprobe.h"
#include "dialogs/fabuploadprogress.h"
#include <QJsonArray>
#include <QJsonDocument>
#include <QEventLoop>
#include <QTimer>

FabUploadProgressProbe::FabUploadProgressProbe(FabUploadProgress *fabUploadProgress)
	: QObject(fabUploadProgress)
	, FProbe("FabUploadProgressProbe")
	, m_fabUploadProgress(fabUploadProgress) {}

QVariant FabUploadProgressProbe::read() {
	QTimer timer;
	timer.setSingleShot(true);
	QList<QMetaObject::Connection> connections;
	QSharedPointer<QEventLoop> loop = QSharedPointer<QEventLoop>::create();

	auto handleEvent = [this, loop](const QString& reason) {
		if (!loop.isNull()) {
			m_reason = reason;
			loop->quit();
		}
	};
	connections << QObject::connect(m_fabUploadProgress, &FabUploadProgress::processingDone,
			 this, [handleEvent]{ handleEvent("success"); });
	connections << QObject::connect(m_fabUploadProgress, &FabUploadProgress::closeUploadError,
			 this, [handleEvent]{ handleEvent("error"); });
	connections << QObject::connect(m_fabUploadProgress, &QObject::destroyed,
			 this, [handleEvent]{ handleEvent("cancel"); });
	QObject::connect(&timer, &QTimer::timeout, this, [handleEvent]{ handleEvent("timeout"); });

	constexpr int timeoutSeconds = 300;
	timer.start(timeoutSeconds * 1000);
	loop->exec();
	for (auto &connection : qAsConst(connections)) {
		QObject::disconnect(connection);
	}
	return QVariant(m_reason);
}
