#ifndef SEQUENZ_H
#define SEQUENZ_H

#include <QString>
#include <kamera.h>
#include <object.h>
#include <QList>
#include <QLabel>

/*
 * Verwaltet alle Daten einer Bildsequenz
 */
class Sequenz
{
public:
    // Eine Datenstruktur, welche eine Objekt-Klasse repräsentiert
    struct SegmentationClass
    {
        int id;
        QString name;
    };

private:
    QString path; // Der Pfad zum Ordner der Sequenz
    int ref; // Reference Counting
    int frameIndex; // Der Index des ausgewählten Bildes
    int cameraIndex; // Der Index der ausgewählten Kamera
    QList< Kamera* > cams; // Eine Liste mit Kameras
    QList< Object > objects; // Eine Liste mit Objekten
    QList< SegmentationClass > classes; // Eine Liste mit Objekt Klassen

public:
    Sequenz( QString p, QList< Kamera* > c, QList< Object > pa );
    ~Sequenz();

    // Gibt eine Liste mit allen bekannten Objekt Klassen zurück
    QList< SegmentationClass > getClasses() const;
    // Setzt den Namen der Objekt Klasse mit der ID id auf name
    bool setClassName( int id, QString name );
    // Prüft, ob bereits annotierte Objekte in der Sequenz vorhanden sind
    bool hasAnnotatedObjects() const;
    // Gibt den Namen der Objekt Klasse mit der ID id zurück
    QString getClassName( int id ) const;
    // Gibt die ID der Objekt Klasse mit dem Namen name zurück
    int getClassId( QString name ) const;
    // Gibt die ID der Klasse des Objektes mit der ID objektId zurück
    int getClassOfObject( QString objektId ) const;
    // Setzt die ID der Klasse des Objektes mit der ID objektId auf classId
    void setClassOfObject( QString objektId, int classId );
    // Fügt eine neue Objekt Klasse mit Namen name hinzu
    int addClass( QString name );
    // Entfernt die Objektklasse mit der ID id
    bool removeClass( int id );
    // Wählt das frame-te Bild der cam-ten Kamera aus
    void selectFrame( int cam, int frame );
    // Gibt das ausgewählte Bild zurück
    Frame *getFrame() const;
    // Gibt den Index der ausgewählten Kamera zurück
    int getSelectedCamera() const;
    // Gibt den Index des Ausgewählten Bildes (innerhalb der Kamera) zurück
    int getSelectedFrame() const;
    // Gibt eine Liste mit Kameras zurück
    const QList< Kamera* > &getCameras() const;
    // Wählt das nachfolgende Bild aus
    void nextFrame();
    // Wählt das vorherige Bild aus
    void previousFrame();
    // Gibt 1 zurück, wenn in der Sequenz ein nachfolgendes Bild existiert
    bool hasNextFrame() const;
    // Gibt 1 zurück, wenn in der Sequenz ein vorheriges Bild existiert
    bool hasPreviousFrame() const;
    // Gibt eine Liste mit allen vergebenen ObjektIds zurück
    QList< QString > getObjectNames() const;
    // Gibt von dem ausgewählten Bild aus das count-nächste Bild von dem Objekt mit ID objektId zurück.
    QImage previousObjectImage( QString objektId, int count = 1 ) const;
    // Fügt eine neue ObjektID mit der Klassen ID classID hinzu
    void addObjectName( QString objektId, int classId );
    // Fügt eine neue ObjektID hinzu
    void addObjectName( QString objektId );
    // Speichert die Sequenz.
    //  status: Ein Label, in denen Fortschrittsinformationen geschrieben werden
    void saveToPath( QLabel *status ) const;
    // Erhöht den Reference Counter um 1
    void refNew();
    // Verringert den Reference Counter um 1 (bei 0 löscht sich das Objekt selbst)
    void refRelease();
};

#endif // SEQUENZ_H
