/*
 * This file is part of Remote Support Desktop
 * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp
 * Copyright 2020-2021 Daniel Teichmann <daniel.teichmann@das-netzwerkteam.de>
 * Copyright 2020-2021 Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
 * SPDX-License-Identifier: GPL-2.0-or-later
 *
 * This program 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 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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 this program; if not, write to the
 * Free Software Foundation, Inc.,
 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#pragma once

#include <QObject>
#include <QQmlApplicationEngine>
#include <QQuickItem>
#include <QTimerEvent>
#include <QTranslator>
#include <QtDBus/QtDBus>

#include "RWADBusAdaptor.h"
#include "main_qmladaptor.h"

class Session : public QObject
{
    Q_OBJECT
    // this makes status available as a QML property
    Q_PROPERTY(QString status READ getStatus NOTIFY statusChanged)
    // this makes service id available as a QML property
    Q_PROPERTY(QString id READ getId NOTIFY idChanged)
    // this makes session_id available as a QML property
    Q_PROPERTY(QString session_id READ getSessionID NOTIFY sessionIDChanged)
    // this makes url available as a QML property
    Q_PROPERTY(QString url READ getURL NOTIFY urlChanged)
    // this makes pin available as a QML property
    Q_PROPERTY(QString pin READ getPin NOTIFY pinChanged)

public:
    explicit Session(QObject *parent, MainQMLAdaptor *main_gui = nullptr);

    QString getStatus();
    QString getURL();
    QString getId();
    QString getSessionID();
    QString getPin();

    void setStatus(QString status);
    void setURL(QString url);
    void setId(QString id);
    void setSessionID(QString session_id);
    void setPin(QString pin);

    // Starts a VNC Session
    void start_request_dbus();
    // Refreshes a VNC Session's status
    void refresh_status_request_dbus(QString id);
    // Stop the Session
    void stop_request_dbus(QString id);
    // Gets a VNC Session's status
    void status_request_dbus(QString id);
    // Returns true if Session is somewhat usable (Running, Alive, etc..)
    bool isSessionAliveOrRunning(QString status);

protected:
    QString _status;
    void statusTimerEvent();
    void init_vars();

private:
    MainQMLAdaptor* _main_gui;
    QString _id;
    QString _session_id;
    QString _url;
    QString _pin;
    OrgArcticaProjectRWASupportSessionServiceInterface* _dbus_rwa;
    void _initDBus();

    bool _minimizedBefore = false;
    void minimizeWindow();

signals:
    void finished();
    void statusChanged(QString);
    void idChanged(QString);
    void sessionIDChanged(QString);
    void urlChanged(QString);
    void pinChanged(QString);

public slots:
    void handleConnectButtonClick(bool checked);

    void start_dbus_replied(QDBusPendingCallWatcher *call);
    void stop_dbus_replied(QDBusPendingCallWatcher *call);
    void status_dbus_replied(QDBusPendingCallWatcher *call);

    void onCloseHandler();
};
