#!/usr/bin/python -tt
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# imports

import logging 
from urlgrabber.progress import BaseMeter,format_time,format_number


# ProcessTransaction States

PT_DOWNLOAD        = 10    # Start Download
PT_DOWNLOAD_PKGS   = 11    # Packages to download
PT_GPGCHECK        = 20    # Start Checkin Package Signatures
PT_TEST_TRANS      = 30    # Start Test Transaction
PT_TRANSACTION     = 40    # Start Transaction

PT_MESSAGES = { PT_DOWNLOAD    : "Downloading Packages",
                PT_GPGCHECK    : "Check Package Signatures",
                PT_TEST_TRANS  : "Running Test Transaction",
                PT_TRANSACTION : "Running Transaction"}



class ProcessTransBaseCallback:
    
    def __init__(self):
        self.logger = logging.getLogger('yum.verbose.ProcessTrasactionBaseCallback')
        
    def event(self,state,data=None):
        if state in PT_MESSAGES.keys():
            self.logger.info(PT_MESSAGES[state])

class ProcessTransNoOutputCallback:
    def __init__(self):
        pass
         
    def event(self,state,data=None):
        pass
    
class DownloadBaseCallback( BaseMeter ):
    """ 
    This is class is a base class to use by implement a download progress
    handler to be used with YumBase.repos.setProgressBar.
    
    Example:
    
    from yum.callbacks import DownloadBaseCallback
    
    class MyDownloadCallback(  DownloadBaseCallback ):

        def updateProgress(self,name,frac,fread,ftime):
            '''
            Update the progressbar
            @param name: filename
            @param frac: Progress fracment (0 -> 1)
            @param fread: formated string containing BytesRead
            @param ftime : formated string containing remaining or elapsed time
            '''
            pct = int( frac*100 )
            print " %s : %s " % (name,pct)


    if __name__ == '__main__':
        my = YumBase()
        my.doConfigSetup()
        dnlcb = MyDownloadCallback()
        my.repos.repos.setProgressBar( dnlcb )
        for pkg in my.pkgSack:
            print pkg.name

    """
    
    def __init__(self):
        BaseMeter.__init__( self )
        self.totSize = ""   # Total size to download in a formatted string (Kb, MB etc)
        
    def update( self, amount_read, now=None ):
        BaseMeter.update( self, amount_read, now )

    def _do_start( self, now=None ):
        name = self._getName()
        self.updateProgress(name,0.0,"","")
        if not self.size is None:
            self.totSize = format_number( self.size )

    def _do_update( self, amount_read, now=None ):
        fread = format_number( amount_read )
        name = self._getName()
        if self.size is None:
            # Elapsed time
            etime = self.re.elapsed_time()
            fetime = format_time( etime )
            frac = 0.0
            self.updateProgress(name,frac,fread,fetime)
        else:
            # Remaining time
            rtime = self.re.remaining_time()
            frtime = format_time( rtime )
            frac = self.re.fraction_read()
            self.updateProgress(name,frac,fread,frtime)


    def _do_end( self, amount_read, now=None ):
        total_time = format_time( self.re.elapsed_time() )
        total_size = format_number( amount_read )
        name = self._getName()
        self.updateProgress(name,1.0,total_size,total_time)

    def _getName(self):
        '''
        Get the name of the package being downloaded
        '''
        if self.text and type( self.text ) == type( "" ):
            name = self.text
        else:
            name = self.basename
        return name

    def updateProgress(self,name,frac,fread,ftime):
        '''
         Update the progressbar (Overload in child class)
        @param name: filename
        @param frac: Progress fracment (0 -> 1)
        @param fread: formated string containing BytesRead
        @param ftime : formated string containing remaining or elapsed time
        '''
        pass
        
