#!/usr/bin/env python
# encoding: utf-8
"""
This module handles providing stats data to the rest of the Glance GUI.

Created by evas Nov 2011.
Copyright (c) 2011 University of Wisconsin SSEC. All rights reserved.
"""

from pkg_resources import resource_string, resource_filename
from mako.template import Template
from mako.lookup   import TemplateLookup

import glance.stats as stats
import glance.data  as dataobjects

import logging

LOG = logging.getLogger(__name__)

class GlanceGUIStats (object) :
    """
    this class represents a model object that manages providing
    statistics information to the Glance GUI
    
    it includes:
    
    self.dataModel      - the GlanceGUIModel object that contains the main data
                          model for the GUI
    self.statsListeners - objects that want to be notified when stats are calculated
    self.errorHandlers  - objects that want to be notified when there's a serious error
    """
    
    def __init__ (self, dataModelToSave) :
        """
        create the gui stats object, hanging onto the dataModel given
        """
        
        self.dataModel      = dataModelToSave
        self.statsListeners = [ ]
        self.errorHandlers  = [ ]
    
    def registerStatsListener (self, objectToRegister) :
        """
        add the given object to our list of stats listeners
        """
        
        if objectToRegister not in self.statsListeners :
            self.statsListeners.append(objectToRegister)
    
    def registerErrorHandler (self, objectToRegister) :
        """
        add the given object to our list of error handlers
        """
        
        if objectToRegister not in self.errorHandlers :
            self.errorHandlers.append(objectToRegister)
    
    def sendStatsInfo (self) :
        """
        our data listeners should be sent statistics information for a comparison
        of the currently selected variables (if possible)
        
        may raise an IncompatableDataObjects exception if it is impossible to compare the given data
        """
        
        # get Variable names
        aVarName    = self.dataModel.getVariableName("A")
        bVarName    = self.dataModel.getVariableName("B")
        
        # get Data objects
        aDataObject = self.dataModel.getVariableData("A", aVarName)
        bDataObject = self.dataModel.getVariableData("B", bVarName)
        
        # check the minimum validity of our data; this call can raise an IncompatableDataObjects exception
        dataobjects.DiffInfoObject.verifyDataCompatability(aDataObject, bDataObject, aVarName, bVarName)
        
        LOG.info ("Constructing statistics")
        
        # do the statistical analysis and collect the data that will be needed to render it nicely
        tempAnalysis = stats.StatisticalAnalysis.withDataObjects(aDataObject, bDataObject,
                                                                 epsilon=self.dataModel.getEpsilon(),
                                                                 epsilon_percent=self.dataModel.getEpsilonPercent())
        tempInfo = { 'variable_name':       aVarName,
                     'alternate_name_in_B': bVarName }
        kwargs   = { 'runInfo':    tempInfo,
                     'statGroups': tempAnalysis.dictionary_form() }
        
        # use a mako template to render an html verion of the stats for display
        templateLookup = TemplateLookup(directories=[resource_filename(__name__, ".")])
        guiTemplate    = Template(resource_string(__name__, "guistatsreport.txt"), lookup=templateLookup)
        renderedText = guiTemplate.render(**kwargs)
        
        # tell my listeners to show the stats data we've collected
        for listener in self.statsListeners :
                listener.displayStatsData(aVarName, bVarName, renderedText)