#ifndef _INCLUDED_BOBCAT_LOG_
#define _INCLUDED_BOBCAT_LOG_

#include <iosfwd>
#include <ostream>
#include <fstream>
#include <climits>
#include <memory>

#include <bobcat/logbuffer>

namespace FBB
{

enum LogManipulator
{
    FATAL,
    nl,
};

class Log: private LogBuffer, public std::ostream
{
    private:
        static std::auto_ptr<Log> s_stream;

        std::ofstream d_stream;
        size_t d_level;
        size_t d_activeLevel;

    public:
        static Log &getInstance();
        static Log &initialize(std::string const &filename, 
                std::ios::openmode = std::ios::out | std::ios::app, 
                char const *delim = " ");

        Log(char const *delim = " ");
        Log(std::ostream &out,  char const *delim = " ");
        Log(std::string const &filename, 
                std::ios::openmode = std::ios::out | std::ios::app, 
                char const *delim = " ");

        void open(std::string const &filename, 
                std::ios::openmode = std::ios::out | std::ios::app, 
                char const *delim = " ");

        std::ostream &level(size_t useLevel);
        void  setLevel(size_t newLevel);
        void  setTimestamp(TimeStamps timeStamp, char const *delim = " ");
        void  off();

    private:
        void init();
};

inline void  Log::off()
{
    setActive(false);
}

} // FBB

std::ostream &operator<<(std::ostream &str, FBB::LogManipulator);
        
#endif
