#ifndef SCSTWAPPBACKEND_H
#define SCSTWAPPBACKEND_H

#include <QObject>

#include <scstwclient.h>
#include <scstwrace.h>
#include <ScStw.hpp>
#include <scstwremotemonitorrace.h>

#include "headers/scstwappsettings.h"


class ScStwAppBackend : public QObject
{
    Q_OBJECT

    Q_PROPERTY(int mode READ getMode NOTIFY modeChanged)
    Q_PROPERTY(ScStwRace* race READ getRace NOTIFY raceChanged)
    Q_PROPERTY(ScStwClient *scStwClient READ getScStwClient NOTIFY scStwClientChanged)
    Q_PROPERTY(ScStwAppSettings *settings READ getSettings NOTIFY settingsChanged)

public:
    explicit ScStwAppBackend(QObject *parent = nullptr);

    enum RaceMode { LOCAL, REMOTE };

private:
    RaceMode mode;

    ScStwAppSettings * appSettings;
    ScStwClient * scStwClient;

    QTimer * timerTextRefreshTimer;

    ScStwRace * localRace;
    ScStwRemoteMonitorRace * remoteRace;

public slots:
    // functions for qml
    Q_INVOKABLE ScStwRace *getRace();
    Q_INVOKABLE ScStwClient *getScStwClient();
    Q_INVOKABLE ScStwAppSettings *getSettings();
    Q_INVOKABLE int getMode();

    // athlete management
    Q_INVOKABLE QVariant getAthletes();
    Q_INVOKABLE bool createAthlete( QString userName, QString fullName );
    Q_INVOKABLE bool deleteAthlete( QString userName );
    Q_INVOKABLE bool selectAthlete( QString userName, int timerId );
    Q_INVOKABLE QVariant getResults( QString userName );

private slots:
    void refreshTimerText();
    void refreshMode();
    void reloadRaceSettings();
    void reloadBaseStationIpAdress();
    void handleSettingChange(int keyInt, int keyLevel, QVariant value);

signals:
    void modeChanged();
    void raceChanged();
    void scStwClientChanged();
    void settingsChanged();

    void baseStationStateChanged();
    void baseStationConnectionsChanged();
    void baseStationPropertiesChanged();
};

#endif // SCSTWAPPBACKEND_H
