/** imagereader.cpp - Read an image off the disk.
 *
 * bsAniPic - http://www.buckosoft.com/bsAniPic/
 *
 * Copyright(c) BuckoSoft, 2017.
 * Released under GNU GPL v3 https://www.gnu.org/licenses/gpl-3.0.en.html
 */

#include <QImageReader>
#include <QPainter>
#include <QFile>
#include <QDebug>

#include "imagereader.h"
#include "bsimage.h"

static const bool DEBUG = false;

ImageReader::ImageReader(QThread *parent) : QThread(parent)
{
    badImage = NULL;
    myGeneration = 0;
    shouldDie = false;
}

ImageReader::~ImageReader()
{
    if (DEBUG) qDebug() << "~ImageReader";
}

void ImageReader::run()
{
    BsImage tempBsImage;

    if (DEBUG) qDebug() << "ImageReader thread startup";
    forever {
        if (shouldDie)
            return;
        while (imageQueue->isEmpty()) {
            if (shouldDie)
                return;
            imageQueueWaitMutex.lock();
            imageQueueWaitCondition->wait(&imageQueueWaitMutex);
            imageQueueWaitMutex.unlock();
            if (DEBUG) qDebug() << "ImageReader wokeup";
            if (shouldDie)
                return;
        }
        imageQueueMutex->lock();
        BsImage* bi = imageQueue->first();
        tempBsImage.filename = bi->filename;
        imageQueueMutex->unlock();
        readImage(&tempBsImage);

        imageQueueMutex->lock();
        if (imageQueue->isEmpty()) {
            imageQueueMutex->unlock();
            continue;
        }
        bi = imageQueue->first();
        if (tempBsImage.filename == bi->filename) {
            if (DEBUG)
                qDebug() << "ImageReader: returning image: " << bi->filename;
            if (!tempBsImage.text.isEmpty()) {
                bi->text = tempBsImage.text;
                tempBsImage.text = "";
            }
            bi->generation = tempBsImage.generation;
            bi->image = tempBsImage.image;
            tempBsImage.image = NULL;
        }
        imageQueue->removeFirst();
        imageQueueMutex->unlock();
     }
}

void ImageReader::readImage(BsImage* bsImage)
{
    //bsImage->mutex.lock();
    QString f = baseDir;
    if (isBsacDir)
        f += "BSAC/frames/";
    f += bsImage->filename;
    if (DEBUG) qDebug() << "ImageReader::readImage:" << f;
    QImageReader reader(f);
    reader.setAutoTransform(true);
    QImage* image = new QImage();
    bool result= reader.read(image);
    if (!result) {
        QString s("Failed to read image: ");
        s.append(f);
        qWarning() << "ImageReader::readImage: " << s;
        return;
    }
    if (wantBsacText) {
        QString f = bsImage->filename.left( bsImage->filename.lastIndexOf('.'));
        f = baseDir + "BSAC/texts/" + f + ".bse";
        QFile file(f);
        if (file.exists()) {
            file.open(QIODevice::ReadOnly);
            QByteArray ba = file.readAll();
            bsImage->text = ba;
            file.close();
            int i = bsImage->text.indexOf("@@begin");
            if (i != -1) {
                i += 7;
                while (bsImage->text.at(i).isSpace())
                    i++;
                int j = bsImage->text.indexOf("@@end");
                if (j == -1)
                    j = bsImage->text.length();
                bsImage->text = bsImage->text.mid(i, j-i);
            }
        }
    }
    bsImage->image = image;
    bsImage->generation = myGeneration++;
    if (DEBUG) qDebug() << "ImageReader: read";
}

QImage* ImageReader::getBadImage()
{
    const int w = 720;
    const int h = 480;
    if (badImage != NULL)
        return(badImage);
    badImage = new QImage(w,h, QImage::Format_RGB32);
    badImage->fill(Qt::black);
    QPainter* qp = new QPainter(badImage);
    QPen pen(Qt::red);
    pen.setWidth(5);
    qp->setPen(pen);
    qp->drawLine(0,0, w,h);
    qp->drawLine(0,h, w,0);
    delete qp;
    return(badImage);
}
