#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# =============================================================================
## @file sync-dirs
#  Simple utility for (parallel) syncronization of directories
#
#  It tries:
#  - GNU paralllel
#  - xargs 
#  - ... and ostap's parallelisation machinery as backup solution
#
#  @author Vanya BELYAEV Ivan.Belyaev@itep.ru
#  @date   2013-02-10
# =============================================================================
""" Simple utility for (parallel) syncronization of directories 

 It tries:
 - GNU paralllel
 - xargs 
 - ... and ostap's parallelisation machinery as backup solution 

"""
# =============================================================================
__version__ = "$Revision$"
__author__  = "Vanya BELYAEV Ivan.Belyaev@itep.ru"
__date__    = "2013-02-10"
# =============================================================================
__all__     = ()
# =============================================================================
if '__main__' == __name__ :

    # =============================================================================
    import os, sys 
    os.environ['OSTAP_ARGPARSE'] = 'False'
    
    # =============================================================================
    from   ostap.logger.logger import getLogger
    logger = getLogger( 'ostap.sync-dirs' )
    
    from   ostap.utils.basic  import numcpu
    from   ostap.utils.timing import timing
    from   ostap.io.utils     import commonpath 
    from   ostap.io.files     import sync_dirs, fsize_unit
    import ostap.logger.table  as    T
    import argparse
    
    parser = argparse.ArgumentParser  (
        prog       = "sync-dirs" )
    
    parser.add_argument    (
        '--parallel' ,
        type    = int         , 
        help    = "Parallel processing [default: %d]" % numcpu()  ,
        default = numcpu()    ) 

    parser.add_argument    (
        '--progress'                  ,
        help    = "Show progress bar" ,
        action  = "store_true"        ,
        default = False               ) 
    
    parser.add_argument    (
        '--verbose' ,
        help    = "Verbose processing [default: False]" ,
        action  = "store_true"        , 
        default = False               ) 
    
    parser.add_argument   (
        '-c' , '--command' ,
        type    = str , 
        help    = "Underlying command  [default is `%(default)s' ] " ,
        default = ''    )
    
    parser.add_argument   (
        "source"      ,
        type    = str , 
        help    = "The source directory" )
    
    parser.add_argument   (
        "target"      ,
        type    = str , 
        help    = "The target directory" )
    
    config = parser.parse_args ( sys.argv[1:] )

    ## 
    if config.parallel <= 0 :
        config.parallel = False
    
    if config.verbose : 
        logger.debug ( "Configuration: %s" % config )
        ## from ostap.utils.docme import docme
        ## docme ( __name__ , logger = logger )
        
    with timing ( 'Sync %s' % config.source , logger = logger if config.verbose else None ) as timer : 
        result = sync_dirs ( source_dir = config.source   ,
                             new_dir    = config.target   ,
                             parallel   = config.parallel ,
                             copy_cmd   = config.command  ,
                             progress   = config.progress or config.verbose )
        
    if config.verbose :
        
        ts    = 0
        cp    = commonpath ( result )
        cp    = cp if os.path.isdir ( cp ) else os.path.dirname ( cp )
        lcp   = len ( cp )

        rows  = [ ( '#' , 'Sync' , 'size' ) ]
        for i, r in enumerate ( result , start = 1 ) :
            fs     = os.path.getsize ( r  )
            ts    += fs 
            s , u  = fsize_unit   ( fs )
            rp     = r[lcp+1:]            
            row    = '%d' % i , rp , '%.0f%s' %  ( s , u )
            rows.append ( row )
            
        speed = int ( ts / timer.delta ) 
        s1 , u1 = fsize_unit ( ts    )
        s2 , u2 = fsize_unit ( speed )
        
        tsize   = '%.1f%s'   % ( s1 , u1 )
        speed   = '%.1f%s/s' % ( s2 , u2 )
        
        title = 'Sync to %s: #%d files, size %s, speed %s' % ( cp , len ( result ) , tsize , speed ) 
        table = T.table ( rows , title = title , alignment = 'llr' , prefix = '# ' )
        logger.info ( '%s:\n%s' % ( title , table ) )
        logger.info ( title )
        
# =============================================================================
##                                                                      The END 
# =============================================================================



