#include "changepacket.h"
#include "ui_changepacket.h"
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QDebug>
#include <QResizeEvent>
#include <QIntValidator>
#include <QMessageBox>

int ChangePacket::lastId = 0;

// Erstellt den Dialog
//  p: Das Polygon des Objektes, wessen ID zugewiesen werden soll
//  s: Die Sequenz, welche momentan annotiert wird
//  parent: Das Eltern QWidget von Qt
ChangePacket::ChangePacket(ObjectPolygon p, Sequenz *s, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ChangePacket),
    seq( s ),
    object( p ),
    count( -1 )
{
    ui->setupUi(this);
    setWindowTitle( "Paket zuweisen" );
    show();
    Frame *f = (Frame*)p->getParent();
    ui->packet->setPixmap( QPixmap::fromImage( f->getObjectImage( p ).scaled(ui->packet->size(),Qt::KeepAspectRatio) ) );
    ui->name->setText( p->getId() );
    QList< QString > objects = s->getObjectNames();
    if( objects.indexOf( "-1" ) < 0 )
        ui->packetList->addItem( "-1" );
    max = -1;
    for( auto p = objects.begin(); p != objects.end(); p++ )
    {
        ui->packetList->addItem( *p );
        if( p->toInt() > max )
            max = p->toInt();
    }
    ui->name->setValidator( new QIntValidator( -1, max + 1 ) );
    if( p->getId() == "-1" && lastId <= max + 1 && lastId >= 0 )
        ui->name->setText( QString::number( lastId ) );
    updatePreview();
    ui->name->clearFocus();
}

ChangePacket::~ChangePacket()
{
    delete ui;
}

// verarbeitet Tastatur Events (wird automatisch vom Qt Framework
// aufgerufen)
void ChangePacket::keyReleaseEvent(QKeyEvent *e)
{
    int current = ui->name->text().toInt();
    if( e->key() == Qt::Key_Down && current != -1 )
        current--;
    if( e->key() == Qt::Key_Up && current < max + 1 )
        current++;
    if( e->key() == Qt::Key_Down || e->key() == Qt::Key_Up )
        ui->name->setText( QString::number( current ) );
    updatePreview();
}

// verarbeitet Tastatur Events (wird automatisch vom Qt Framework
// aufgerufen)
void ChangePacket::mousePressEvent(QMouseEvent *e)
{
    ui->name->clearFocus();
}

// Zeigt das neu ausgewählte Vergleichsobjekt an
void ChangePacket::on_packetList_currentIndexChanged(const QString &packet)
{
    ui->packetCompare->setPixmap( QPixmap() );
    if( packet != "-1" )
    {
        ui->name->setText( packet );
        ui->packetCompare->setPixmap( QPixmap::fromImage( seq->previousObjectImage( packet, count ).scaled(ui->packetCompare->size(),Qt::KeepAspectRatio) ) );
    }
}

// Zeigt das Vergleichsobjekt aus einem vorherigen Bild an
void ChangePacket::on_previousePicture_clicked()
{
    count--;
    if( count == 0 )
        count--;
    ui->packetCompare->setPixmap( QPixmap::fromImage( seq->previousObjectImage( ui->packetList->currentText(), count ).scaled(ui->packetCompare->size(),Qt::KeepAspectRatio) ) );
}

// Zeigt das Vergleichobjekt aus einem nachfolgenden Bild an
void ChangePacket::on_nextPicture_clicked()
{
    count++;
    if( count == 0 )
        count++;
    ui->packetCompare->setPixmap( QPixmap::fromImage( seq->previousObjectImage( ui->packetList->currentText(), count ).scaled(ui->packetCompare->size(),Qt::KeepAspectRatio) ) );
}

// Bricht das Zuweisen der Objekt-ID ab ohne sie zu speichern
void ChangePacket::on_abbrechen_clicked()
{
    this->close();
}

// Beendet das Zuweisen der Objekt-ID un speichert die neue ID
void ChangePacket::on_speichern_clicked()
{
    if( ui->name->text() == "-1" || ui->name->text() == "" )
    {
        QMessageBox::critical( this, "Fehler", "Ungültige Objekt Id." );
        return;
    }
    if( ui->name->text() != object->getId() )
    {
        bool needQ = ((Frame*)object->getParent())->hasObject( ui->name->text() );
        object->setId( ui->name->text() );
        lastId = ui->name->text().toInt();
        seq->addObjectName( ui->name->text() );
        if( needQ )
        {
            QMessageBox::StandardButton reply = QMessageBox::question(0, "Warnung", "Auf diesem Bild gibt es bereits ein Objekt mit der gleichen Id. Möchten sie beide Objekte vereinen?",
                                                                      QMessageBox::Yes|QMessageBox::No);
            if (reply == QMessageBox::Yes)
                ((Frame*)object->getParent())->connectObjects( ui->name->text() );
        }
    }
    this->close();
}

// Wählt automatisch das Vergleichsobjekt aus, welches die ID hat, welche im Textfeld eingegeben wurde
void ChangePacket::updatePreview()
{
    int index = ui->packetList->findText( ui->name->text() );
    if( index < 0 )
        index = 0;
    ui->packetList->setCurrentIndex( index );
    count = -1;
}