/** dirman.h - Manage the images in a directory
 *
 * 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 DIRMAN_H
#define DIRMAN_H

#include <QVector>
#include <QTimer>
#include <QDir>

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

extern int extractFrameNumber(const QString& s);

class DebugText {
public:
    DebugText() {}
    DebugText(int f, QString s) {frame = f; text = s; }
    int     frame;
    QString text;
};


class DirMan : QObject
{
    Q_OBJECT

public:
    DirMan(QObject *parent = 0);
    virtual ~DirMan();
    void    setDirectory(QString directory = NULL);
    void    setLoadBsacText(bool onoff);
    const QString& getDirectory();
    void    refreshDirectory();
    int     getNumberOfImages();
    void    setCurrentImage(int index);
    int     getCurrentImageIndex();
    const QImage*   getCurrentImage();
    const QImage*   getBadImage();
    const BsImage*  getCurrentBsImage();
    const BsImage*  getCurrentBsImageNaked();   // Don't insure the image is present, just return the structure.
    const BsImage*  getBsImageNaked(int index);

    int     getImageNumberFromFrameNumber(int frameNumber);
    void    prepareToDie();
    void    createBsAniDirectory(QString debugName);

    bool    isBsacDirectory;
    bool    isBsAniDirectory;
    QString povDebugFileName;

signals:
    //void    readImage(QString* baseDir, BsImage* bsImage, bool isBsacDir, bool wantText);

private slots:
    //void    imageRead(BsImage* bsImage);
    //void    readerError(BsImage* imageOfError, QString error);
    void    timerFired();

private:
    void    readImage(int which);

    QVector<BsImage*> imageList;
    int     currentImage;
    QVector<BsImage*>   readerQueue;
    QMutex              readerQueueMutex;
    QWaitCondition      readerQueueWaitCondition;


private:
    QString directory;
    QString imageDir;
    QString textDir;
    bool    isLoadBsacText;

    QDir    bsAniPicDir;

    enum { NumImagesToHold = 5 };
    //int     numImagesHeld;
    QVector<BsImage*>   imagesInMemoryList;
    QTimer*             timer;

    ImageReader*    imageReader;
    int     myGeneration;

    void startImageReader();
    void readDebugText(QVector<DebugText>& textList, QString& fileName);
};

inline const QString& DirMan::getDirectory() { return(directory); }
inline int DirMan::getNumberOfImages() { return(imageList.size()); }
inline int DirMan::getCurrentImageIndex() { return(currentImage); }
inline const QImage* DirMan::getBadImage() { return(imageReader->getBadImage()); }

#endif // DIRMAN_H
