/** imagereader.h - 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
 */

#ifndef IMAGEREADER_H
#define IMAGEREADER_H

#include <QThread>
#include <QVector>
#include <QMutex>
#include <QWaitCondition>

class BsImage;

class ImageReader : public QThread
{
    Q_OBJECT
public:
    explicit ImageReader(QThread *parent = 0);
    virtual ~ImageReader();
    /** Setup system attribute pointers */
    void    setUp(QVector<BsImage*>* imageQueue, QMutex* imageQueueMutex, QWaitCondition* waitCondition) {
                        this->imageQueue = imageQueue; this->imageQueueMutex = imageQueueMutex; this->imageQueueWaitCondition = waitCondition;
    }
    /** Configure user controlled attributes */
    void    config(QString& baseDir, bool isBsacDir, bool wantBsacText) {
                        this->baseDir = baseDir; this->isBsacDir = isBsacDir; this->wantBsacText = wantBsacText;
    }
    /** Return a dummy image representing bad */
    QImage* getBadImage();
    void    setDie() { this->shouldDie = true; }
    void    run() override;


signals:
    //void    finished();
    //void    imageReaderDone(BsImage* bsImage);
    //void    error(BsImage* bsImage, QString err);

public slots:
    /** Read an image.
     * @param bsImage The BsImage to write our result to
     */
    void    readImage(BsImage* bsImage);

private:
    QVector<BsImage*>*  imageQueue;
    QMutex*             imageQueueMutex;
    QWaitCondition*     imageQueueWaitCondition;
    QMutex              imageQueueWaitMutex;
    bool                isBsacDir;
    bool                wantBsacText;
    QString             baseDir;
    int                 myGeneration;
    bool                shouldDie;
    QImage*             badImage;
};

#endif // IMAGEREADER_H
