#ifndef CONTROLLER_H
#define CONTROLLER_H

#include <QWheelEvent>

#include "usermode.h"

class ArbeitsModel;

/*
 * Dieser Controller verwaltet die Benutzereingaben in der Arbeitsfläche der GUI
 */
class ArbeitsController
{
protected:
    ArbeitsController(ArbeitsModel *m);

    ArbeitsModel *model; // Ein Zeiger auf das ArbeitsModel, welches die Daten der ArbeitsView enthält

private:

    static ArbeitsController *controller[USERMODE_COUNT]; // Eine Liste mit allen Controller Objekten, die es gibt

public:
    // Setzt den Controller zurück
    virtual void restartController();

    // verwaltet das drehen des Mausrades
    virtual void wheelEvent(QWheelEvent *e);

    // verwaltet das Drücken einer Maustaste
    virtual void mousePressEvent(QMouseEvent *e);

    // verwaltet das Bewegen der Maus
    virtual void mouseMoveEvent(QMouseEvent *e);

    // verwaltet das Loslassen einer Maustaste
    virtual void mouseReleaseEvent(QMouseEvent *e);

    // gibt den Controller zurück, welcher in einem Bestimmten Modus verwendet
    // wird
    //  m: der Modus, bei dem der gesuchte Controller benutzt wird
    static ArbeitsController* getController(UserMode m);

    // Erstellt die Controller, welche bei den verschiedenen Modis benutzt
    // werden sollen
    //  m: Das Modell, welches alle nötigen Daten vür die Arbeitsansicht enthält
    static void initStaticController(ArbeitsModel *m);
};

/*
 * Controller für den SELECT Modus
 */
class HideController : public ArbeitsController
{
public:

    HideController(ArbeitsModel *m);

    void mouseReleaseEvent(QMouseEvent *e) override;
};

/*
 * Controller für den MOVE Modus
 */
class MoveController : public ArbeitsController
{
public:

    MoveController(ArbeitsModel *m);

    void mousePressEvent(QMouseEvent *e) override;
    void mouseMoveEvent(QMouseEvent *e) override;

private:
};

/*
 * Controller für den CUT Modus
 */
class CutController : public ArbeitsController
{
public:

    CutController(ArbeitsModel *m);

    void mouseReleaseEvent(QMouseEvent *e) override;
};

/*
 * Controller für den PIPETTE_SELECT Modus
 */
class CopyController : public ArbeitsController
{
public:

    CopyController(ArbeitsModel *m);

    void mouseReleaseEvent(QMouseEvent *e) override;
};

/*
 * Controller für den PIPETTE_SET Modus
 */
class PasteController : public ArbeitsController
{
public:

    PasteController(ArbeitsModel *m);

    void mouseMoveEvent(QMouseEvent *e) override;
    void mouseReleaseEvent(QMouseEvent *e) override;
};

/*
 * Controller für den NEW Modus
 */
class NewController : public ArbeitsController
{
public:

    NewController(ArbeitsModel *m);

    void mouseReleaseEvent(QMouseEvent *e) override;

    void restartController() override;
};

/*
 * Controller für den DELETE Modus
 */
class DeleteController : public ArbeitsController
{
public:

    DeleteController(ArbeitsModel *m);

    void mousePressEvent(QMouseEvent *e) override;
    void mouseMoveEvent(QMouseEvent *e) override;
    void mouseReleaseEvent(QMouseEvent *e) override;
};

/*
 * Controller für den ZOOM_IN Modus
 */
class ZoomInController : public ArbeitsController
{
public:

    ZoomInController(ArbeitsModel *m);

    void mousePressEvent(QMouseEvent *e) override;
    void mouseMoveEvent(QMouseEvent *e) override;
    void mouseReleaseEvent(QMouseEvent *e) override;
};

#endif // CONTROLLER_H
