#ifndef WSJTX2_FOXVERIFIER_HPP
#define WSJTX2_FOXVERIFIER_HPP

#include <QObject>
#include <QString>
#include <QPointer>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QMutex>

#define FOXVERIFIER_DEFAULT_TIMEOUT_MSEC 5000
#define FOXVERIFIER_DEFAULT_BASE_URL "https://www.9dx.cc"

class FoxVerifier : public QObject {
    Q_OBJECT
    QMutex mutex_;

public:
    explicit FoxVerifier(QString user_agent, QNetworkAccessManager *manager, QString base_url, QString callsign, QDateTime timestamp, QString code, unsigned int);
    ~FoxVerifier();

    QString return_value;
    bool finished();
    static QString formatDecodeMessage(QDateTime ts, QString callsign, unsigned int hz, QString const& verify_message);
    static QString default_url();

private:
    QNetworkAccessManager* manager_;
    QNetworkReply* reply_;
    QNetworkRequest request_;
    QUrl q_url_;
    bool finished_;
    bool errored_;
    unsigned int hz_;
    QString error_reason_;
    QDateTime ts_;
    QString callsign_;
    QString code_;

private slots:
    void httpFinished();
    void httpRedirected(const QUrl &url);
    void httpEncrypted();
#ifndef QT_NO_SSL
    void sslErrors(const QList<QSslError> &);
#endif
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
    void errorOccurred(QNetworkReply::NetworkError code);
#endif
//signals:
     //void results(QString verify_response);
     //void error(QString const& reason) const;

public slots:
signals:
     void verifyComplete(int status, QDateTime ts, QString callsign, QString code, unsigned int hz, QString const& response);
     void verifyError(int status, QDateTime ts, QString callsign, QString code, unsigned int hz, QString const& response);

};


#endif //WSJTX2_FOXVERIFIER_HPP