# -*- coding: utf-8 -*-
"""
utilitaires pour tracer l'activité de miiwii

$Id$
$URL$
"""

from events import COLOVER, eventNames
from event_pprinters import pprinters
import sys
import pygame
import logging
import os
import datetime
from config import LOGS_DIR as logsdir
LOG_FORMAT_VERSION='1.0'

hiddenEvents = {pygame.MOUSEMOTION:True,
                pygame.MOUSEBUTTONDOWN:True,
                pygame.MOUSEBUTTONUP:True,
                #COLOVER:True,
                }

if not os.path.exists(logsdir) :
    os.mkdir(logsdir)

if os.environ.has_key('WINWII_NO_LOG') :
    class MinWiiStreamHandler(logging.Handler) :
        def emit(record) : pass
else :
    class MinWiiStreamHandler(logging.StreamHandler) :
        logfile = None
        stream = None
        env = []
    
        def __init__(self) :
            logging.Handler.__init__(self)
            if self.stream is None :
                self.setNewStream()
    
        @classmethod
        def setNewStream(cls) :
            if cls.stream and not cls.stream.closed :
                cls.stream.close()
            logfile = os.path.join(logsdir, datetime.datetime.now().strftime('%Y-%m-%d-%H_%M_%S.log'))
            cls.stream = open(logfile, 'a')
            
        def emit(self, record) :
            if record.name == 'minwii.env' :
                if record.getMessage()=='NEW_LOG_FILE' :
                    self.setNewStream()
                    for rec in self.env :
                        logging.StreamHandler.emit(self, rec)
                    return
                else :
                    self.env.append(record)
            logging.StreamHandler.emit(self, record)

class EventLoggerAdapter(logging.LoggerAdapter) :
    
    FORMAT = "EVT %(ticks)-10s %(eventName)-15s %(message)s"
    
    def process(self, msg, kwargs) :
        pp = pprinters.get(msg.type, lambda e: str(e))
        extra = {}
        extra['eventType'] = msg.type
        extra['eventName'] = eventNames[msg.type]
        extra['ticks'] = pygame.time.get_ticks()
        kwargs['extra']=extra
        return pp(msg), kwargs

class EventFilter :
    
    def __init__(self):
        pass
    
    def filter(self, record) :
        return not hiddenEvents.has_key(record.eventType)


def initAppConsole() :
    global console
    console = logging.getLogger('minwii.console')
    console.setLevel(logging.DEBUG)
    handler = MinWiiStreamHandler()
    handler.setFormatter(logging.Formatter('APP %(message)s'))
    console.addHandler(handler)

def initEnvLogger() :
    global envLogger
    envLogger = logging.getLogger('minwii.env')
    envLogger.setLevel(logging.DEBUG)
    handler = MinWiiStreamHandler()
    handler.setFormatter(logging.Formatter('ENV %(message)s'))
    envLogger.addHandler(handler)
    

def initEventLogger():
    _eventLogger = logging.getLogger('minwii.events')
    _eventLogger.setLevel(logging.INFO)
    _eventHandler = MinWiiStreamHandler()
    _eventFormatter = logging.Formatter(EventLoggerAdapter.FORMAT)
    _eventHandler.setFormatter(_eventFormatter)
    _eventLogger.addHandler(_eventHandler)
    _eventLogger.addFilter(EventFilter())
    global eventLogger
    eventLogger = EventLoggerAdapter(_eventLogger, {})

def initLoggers() :
    initAppConsole()
    initEnvLogger()
    initEventLogger()

initLoggers()
