//This file is part of Photon (http://photon.sourceforge.net)
//Copyright (C) 2004-2005 James Turk
//
// Author:
//  James Turk (jpt2433@rit.edu)
//
// Version:
//  $Id: LogSink.cpp,v 1.5 2005/02/07 01:48:27 cozman Exp $
//
// Revisions:
//  $Log: LogSink.cpp,v $
//  Revision 1.5  2005/02/07 01:48:27  cozman
//  string references
//
//  Revision 1.4  2005/02/05 03:01:04  cozman
//  removed getStream() (useless)
//
//  Revision 1.3  2005/02/04 08:11:54  cozman
//  switched Log to shared_ptrs and added extra flushes
//
//  Revision 1.2  2005/01/27 05:24:11  cozman
//  minor documentation update
//
//  Revision 1.1  2005/01/27 03:35:24  cozman
//  initial import (exceptions,types, and logging,oh my!)
//
//

#include "LogSink.h"

#include <iostream>

namespace photon
{ 

//LogSink

LogSink::LogSink(const std::string& name) :
    name_(name)
{
}

LogSink::~LogSink()
{
}

std::string LogSink::getName() const
{
    return name_;
}

//ConsoleSink

ConsoleSink::ConsoleSink(const std::string& name) :
    LogSink(name)
{
}

ConsoleSink::~ConsoleSink()
{
}

void ConsoleSink::writeMessage(LogLevel level, const std::string& msg)
{
    static char* pre[] = { "    NOTE: ",
                           " VERBOSE: ",
                           " WARNING: ",
                           "   ERROR: ",
                           "CRITICAL: " };

    std::cerr << pre[static_cast<int>(level)] << msg << std::endl;
}

//TextSink

TextSink::TextSink(const std::string& name) :
    LogSink(name),
    out_(std::string(name+".txt").c_str())
{
}

TextSink::~TextSink()
{
    out_.close();
}

void TextSink::writeMessage(LogLevel level, const std::string& msg)
{
    static char* pre[] = { "    NOTE: ",
                           " VERBOSE: ",
                           " WARNING: ",
                           "   ERROR: ",
                           "CRITICAL: " };

    out_ << pre[static_cast<int>(level)] << msg << std::endl;
}

//HTMLSink

HTMLSink::HTMLSink(const std::string& name) :
    LogSink(name),
    out_(std::string(name+".html").c_str())
{
    out_ << "<html><head><title>Error Log</title>\n<style type=\"text/css\">"
         << std::endl << "<!--" << std::endl
         << "p { margin: 0 }" << std::endl
         << ".note { font-style:italic color:gray }" << std::endl
         << ".verbose { font-style:italic; font-size:small }"
         << std::endl
         << ".warning { font-weight:bold; background:yellow }" << std::endl
         << ".error { font-weight:bold; background:orange }" << std::endl
         << ".critical { font-weight:bold; background:red; color:white }"
         << std::endl
         << "-->" << std::endl << "</style>" << std::endl << "</head>"
         << std::endl << "<body>" << std::endl;
}

HTMLSink::~HTMLSink()
{
    out_ << "</body></html>" << std::endl;
    out_.close();
}

void HTMLSink::writeMessage(LogLevel level, const std::string& msg)
{
    static char* css[] = {"note","verbose","warning","error","critical"};
    static char* pre[] = { "    NOTE: ",
                           " VERBOSE: ",
                           " WARNING: ",
                           "   ERROR: ",
                           "CRITICAL: " };

    out_ << "<p class=\"" << css[static_cast<int>(level)] << "\">"
            << pre[static_cast<int>(level)] << msg << "</p>" << std::endl;
}

}