//#
//# Copyright (C) 2021-2023 QuasarApp.
//# Distributed under the GPLv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
//#

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <doctorpillgui.h>
#include <thread>

class EmptyPill: public DP::iPill {


    // iPill interface
public:
    QString name() const override {
        return "EmptyPill";
    };

    int id() const override {
        return typeid (this).hash_code();
    };

    QString description() const override {
        return "Pill For Test. This pill cant be fixed ";
    };

protected:
    bool diagnostic() override {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        return true;
    };
    bool fix() override {
        return true;
    };
};

class EmptyPill1: public DP::iPill {


    // iPill interface
public:
    QString name() const override {
        return "EmptyPill1";
    };

    QString description() const override {
        return "Pill For Test. This pill cant be fixed ";
    };

    int id() const override {
        return typeid (this).hash_code();
    };

protected:
    bool diagnostic() override {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        return true;
    };
    bool fix() override {
        return true;
    };

};


class EmptyPill2: public DP::iPill {


    // iPill interface
public:
    QString name() const override {
        return "EmptyPill2";
    };

    int id() const override {
        return typeid (this).hash_code();
    };

    QString description() const override {
        return "Pill For Test. This pill cant be fixed ";
    };

protected:
    bool diagnostic() override {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        return true;
    };
    bool fix() override {
        return true;
    };
};

class LongPill: public DP::iPill {


    // iPill interface
public:
    QString name() const override {
        return "Long Pill ";
    };

    int id() const override {
        return typeid (this).hash_code();
    };

    QString description() const override {
        return "Lorem Ipsum is simply dummy text of the printing and typesetting industry."
               " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s,"
               " when an unknown printer took a galley of type and scrambled it to make a type specimen book."
               " It has survived not only five centuries,"
               " but also the leap into electronic typesetting,"
               " remaining essentially unchanged."
               " It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,"
               " and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. ";
    };

protected:
    bool diagnostic() override {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        return true;
    };
    bool fix() override {
        return true;
    };
};

int main(int argc, char *argv[]) {
    QCoreApplication::setOrganizationName("QuasarApp");
    QCoreApplication::setApplicationName("DoctorPillExample");

    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    if (!DP::init(&engine)) {
        return -1;
    }

    DP::DoctorModel model({QSharedPointer<EmptyPill>::create(),
                           QSharedPointer<LongPill>::create(),
                           QSharedPointer<EmptyPill1>::create(),
                           QSharedPointer<EmptyPill2>::create()});

    engine.load("qrc:/Main.qml");
    if (engine.rootObjects().isEmpty())
        return -2;

    QQmlContext* rootContext = engine.rootContext();
    if (rootContext)
        rootContext->setContextProperty("doctorPillModel", &model);

    return app.exec();
}