// ***************************************************************************
// BamWriter.h (c) 2009 Michael Str�mberg, Derek Barnett
// Marth Lab, Department of Biology, Boston College
// ---------------------------------------------------------------------------
// Last modified: 10 October 2011 (DB)
// ---------------------------------------------------------------------------
// Provides the basic functionality for producing BAM files
// ***************************************************************************

#ifndef BAMWRITER_H
#define BAMWRITER_H

#include "bamtools/api/api_global.h"
#include "bamtools/api/BamAux.h"
#include <string>

namespace BamTools {

struct BamAlignment;
struct SamHeader;

//! \cond
namespace Internal {
    class BamWriterPrivate;
} // namespace Internal
//! \endcond

class API_EXPORT BamWriter {

    // enums
    public:
        enum CompressionMode { Compressed = 0
                             , Uncompressed
                             };

    // ctor & dtor
    public:
        BamWriter(void);
        ~BamWriter(void);

    // public interface
    public:
        //  closes the current BAM file
        void Close(void);
        // returns a human-readable description of the last error that occurred
        std::string GetErrorString(void) const;
        // returns true if BAM file is open for writing
        bool IsOpen(void) const;
        // opens a BAM file for writing
        bool Open(const std::string& filename, 
                  const std::string& samHeaderText,
                  const RefVector& referenceSequences);
        // opens a BAM file for writing
        bool Open(const std::string& filename,
                  const SamHeader& samHeader,
                  const RefVector& referenceSequences);
        // saves the alignment to the alignment archive
        bool SaveAlignment(const BamAlignment& alignment);
        // sets the output compression mode
        void SetCompressionMode(const BamWriter::CompressionMode& compressionMode);
        // sets the number of threads
        void SetNumThreads(int32_t numThreads);

    // private implementation
    private:
        Internal::BamWriterPrivate* d;
        int32_t m_numThreads;
};

} // namespace BamTools

#endif // BAMWRITER_H
