/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

/*
    Sonic Visualiser
    An audio file viewer and annotation editor.

    Sonic Annotator
    A utility for batch feature extraction from audio files.

    Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London.
    Copyright 2007-2008 QMUL.

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation; either version 2 of the
    License, or (at your option) any later version.  See the file
    COPYING included with this distribution for more information.
*/

#ifndef SV_FILE_FEATURE_WRITER_H
#define SV_FILE_FEATURE_WRITER_H

#include <string>
#include <map>
#include <set>

#include "FeatureWriter.h"

#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#include <QStringConverter>
#endif

class QTextStream;
class QFile;

namespace sv {

class FileFeatureWriter : public FeatureWriter
{
public:
    virtual ~FileFeatureWriter();

    ParameterList getSupportedParameters() const override;
    void setParameters(std::map<std::string, std::string> &params) override;

    void testOutputFile(QString trackId, TransformId transformId) override;
    void flush() override;
    void finish() override;

protected:
    enum FileWriteSupport {
        SupportOneFilePerTrackTransform = 1,
        SupportOneFilePerTrack = 2,
        SupportOneFileTotal = 4,
        SupportStdOut = 8
    };

    FileFeatureWriter(int support, QString extension);
    QTextStream *getOutputStream(QString, TransformId,
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
                                 QStringConverter::Encoding
#else
                                 QString encodingName
#endif
        );

    typedef std::pair<QString, TransformId> TrackTransformPair;
    typedef std::map<TrackTransformPair, QString> FileNameMap;
    typedef std::map<TrackTransformPair, QFile *> FileMap;
    typedef std::map<QFile *, QTextStream *> FileStreamMap;
    FileMap m_files;
    FileNameMap m_filenames;
    FileStreamMap m_streams;
    QTextStream *m_prevstream;

    TrackTransformPair getFilenameKey(QString, TransformId);

    // Come up with a suitable output filename for the given track ID - 
    // transform ID combo. Fail if it already exists, etc.
    QString createOutputFilename(QString, TransformId);

    // Look up and return the output filename for the given track ID -
    // transform ID combo.
    QString getOutputFilename(QString, TransformId);

    // Look up and return the output file handle for the given track
    // ID - transform ID combo. Return 0 if it could not be opened.
    QFile *getOutputFile(QString, TransformId);
    
    // subclass can implement this to be called before file is opened for append
    virtual void reviewFileForAppending(QString) { }

    int m_support;
    QString m_extension;
    QString m_baseDir;
    bool m_manyFiles;
    QString m_singleFileName;
    bool m_stdout;
    bool m_append;
    bool m_force;
};

} // end namespace sv

#endif
