#ifndef IPLUGIN_H
#define IPLUGIN_H

#include <QString>
#include <QWidget>
#include <QtPlugin>
#include <QJsonObject>
#include <QStringList>

#include "service.h"
#include "igridform.h"

class IPlugin
{

public:
    IPlugin() {
        m_ui = NULL;
        m_service = NULL;
    }

    virtual ~IPlugin() {
        if (m_service != NULL)
        {
            delete m_service;
        }

        if (m_ui != NULL && m_ui->parent() == NULL)
        {
            delete m_ui;
        }
    }

    virtual QString pluginName() = 0;
    virtual QString pluginId() = 0;
    virtual QString pluginDescription() = 0;
    virtual int schemaVersion() = 0;
    virtual QStringList schemas() = 0;
    virtual QStringList dependsOn() = 0;

    virtual void init(const QJsonObject &metaData) = 0;

    virtual QWidget *ui() {
        IGridForm *form = qobject_cast<IGridForm*>(m_ui);

        if (form != NULL)
        {
            form->fillData();
        }

        return m_ui;
    }

    template<class T>
    Service<T> *service() {
        return (Service<T>*)m_service;
    }

protected:
    QWidget *m_ui;
    IService *m_service;
};

#define PluginInterface_iid "cz.itsolved.prodejna.IPlugin"

Q_DECLARE_INTERFACE(IPlugin, PluginInterface_iid)

#endif // IPLUGIN_H
