#include "kamera.h"
#include <QProgressDialog>

Kamera::Kamera( QString n, QString maskPath, int index )
    : FrameTreeNode( index, 0, 0 ),
      ref( 1 ),
      name( n ),
      m( maskPath )
{}

Kamera::~Kamera()
{
    for( auto f = frames.begin(); f != frames.end(); f++ )
    {
        delete *f;
    }
}

// Gibt 1 zurück, falls keine Objekte ohne ID existieren und auf keinem Bild eine ID mehrfach vergeben wurde
bool Kamera::isCorrectAnnotated() const
{
    for( Frame *f : frames )
    {
        if( !f->isCorrectAnnotated() )
            return false;
    }
    return true;
}

// Gibt this zurück
void *Kamera::getNodeObject() const
{
    return (void*)this;
}

// gibt die Anzahl der Bilder zurück
int Kamera::getChildCount() const
{
    return frames.size();
}

// Gibt das Bild mit Index index zurück
Frame *Kamera::getFrame( int index ) const
{
    return frames.at( index );
}

// fügt der Kamera das Bild f hinzu
QString Kamera::getName() const
{
    return name;
}

// Wendet die Maske der Kamera auf alle Bilder an
void Kamera::addFrame( Frame *f )
{
    frames.append( f );
    f->applyMask( m );
}

// Gibt den Namen der Kamera zurück
void Kamera::applyMask()
{
    for( auto f = frames.begin(); f != frames.end(); f++ )
    {
        (*f)->applyMask( m );
    }
}

// Gibt die Maske der Kamera zurück
Mask *Kamera::getMask() const
{
    return (Mask*)&m;
}

// Speichert die Maske der Kamera und erzeugt die Bilder in JPEG Images
void Kamera::saveMask()
{
    m.save();
    QProgressDialog progress( "Maske wird gespeichert...", "", 0, frames.size() );
    progress.setWindowModality(Qt::WindowModal);
    progress.setCancelButton( 0 );
    for( auto f = frames.begin(); f != frames.end(); f++ )
    {
        m.saveToFrameMask( (*f)->getImageMatrix(), (*f)->getName() );
        progress.setValue( progress.value() + 1 );
        progress.repaint();
    }
    applyMask();
    progress.close();
}

// Erhöht den Reference Counter um 1
void Kamera::refNew()
{
    ref++;
}

// Verringert den Reference Counter um 1 (bei 0 löscht sich das Objekt selbst)
void Kamera::refRelease()
{
    if( !--ref )
        delete this;
}