#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# =============================================================================
## @file ostap-check-dependencies
#  Check dependencies for ostap 
#  @author Vanya BELYAEV Ivan.Belyaev@itep.ru
#  @date   2011-06-07
# =============================================================================
""" Check dependencies for ostap 
"""
# =============================================================================
from   ostap.core.meta_info   import root_info, python_info, ostap_info 
from   ostap.logger.colorized import attention
from   ostap.logger.logger    import getLogger
# =============================================================================
logger = getLogger('ostap-check-dependencies')
# =============================================================================
rows = [ ( 'Module' , 'version', 'location' ) ]
# =============================================================================
row = 'python' , '.'.join ( str ( a ) for a in python_info ) , ''
rows.append ( row )
# =============================================================================
try : # =======================================================================
    # =========================================================================
    import IPython
    row = 'IPython', IPython.__version__ , IPython.__file__
    rows.append ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    pass
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    pass
# =============================================================================
try : # =======================================================================
    # =========================================================================
    import ostap
    row = 'ostap', ostap.__version__ , ostap.__file__
    rows.append ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    logger.fatal ( 'ostap cannot be imported!' )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    pass
# =============================================================================
try : # =======================================================================
    # =========================================================================
    import ROOT
    row = 'ROOT', ROOT.gROOT.GetVersion() , ROOT.__file__
    rows.append ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    logger.fatal ( 'ROOT cannot be imported!' ) 
    row = attention ( 'ROOT' ) , attention ( '---' ) , '' 
    rows.append  ( row )    
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.fatal ( 'ROOT cannot be imported!' )
    
# =============================================================================
try : # =======================================================================
    # =========================================================================
    import cppyy
    row = 'cppyy', getattr ( cppyy , '__version__' , '' )  , cppyy.__file__
    rows.append ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================    
    logger.fatal ( 'cppyy cannot be imported!' )
    row = attention ( 'cpppy' ) , attention ( '---' ) , '' 
    rows.append  ( row )    
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.fatal ( 'cppyy cannot be imported!' )
# =============================================================================
try : # =======================================================================
    # =========================================================================
    import numpy
    version = getattr ( numpy , '__version__' , '' ) 
    row = 'numpy' , version , numpy.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    message = """numpy cannot be imported! 
    Numpy 'is needed for Fast Fourier Transform used for function/histogram parameterisation.
    and for (almost all) Googness-of-Fit methods 
    - There is no local replacement!
    - see http://numpy.org"""
    logger.error ( message ) 
    row = attention ( 'numpy' ) , attention ( '---' ) , '' 
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'numpy cannot be imported!' )
# =============================================================================        
try : # =======================================================================
    # =========================================================================
    import scipy
    version = getattr ( scipy , '__version__' , '' ) 
    row = 'scipy' , version , scipy.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    message = """scipy cannot be imported!
    Scipy is needed for (almost all) Goodness-of-Fit methods and 
    Scipy is used for an efficient alternative for 
    - numerical integration
    - root findings
    - function minimization
    - histogram/function parameterization
    - see http://www.scipy.org"""
    logger.error ( message )
    row = attention ( 'scipy' ) , attention ( '---' ) , '' 
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'scipy cannot be imported!' )
# =============================================================================        
try : # =======================================================================
    # =========================================================================
    import numba 
    version = getattr ( numba , '__version__' , '' ) 
    row = 'numba' , version , numba.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    message = """numba cannot be imported!
    Numba is useful for better C++/pytini intercommunications 
    """
    logger.warning ( message )
    row = attention ( 'numba' ) , attention ( '---' ) , '' 
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'numba cannot be imported!' )
# =============================================================================        
try : # =======================================================================
    # =========================================================================
    import cffi 
    version = getattr ( cffi , '__version__' , '' ) 
    row = 'cffi' , version , cffi.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    message = """cffi cannot be imported!
    Cffi  is useful for better C++/python inntercommunucations
    """
    logger.warning ( message )
    row = attention ( 'cffi' ) , attention ( '---' ) , '' 
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'cffi  cannot be imported!' )
# =========================================================================
try : # ===================================================================
    # =====================================================================        
    import dbm.gnu
    row = 'dbm.gnu' , ''  , dbm.gnu.__file__
    rows.append  ( row )
    # =====================================================================
except ImportError : # ====================================================
    # =====================================================================
    row = attention ( 'dbm.gnu' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'dbm.gnu  cannot be imported!' )
# =========================================================================
try : # ===================================================================
    # =====================================================================        
    import dbm.ndbm
    row = 'dbm.ndbm' , ''  , dbm.ndbm.__file__
    rows.append  ( row )
    # =====================================================================
except ImportError : # ====================================================
    # =====================================================================
    row = attention ( 'dbm.ndbm' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'dbm.ndbm cannot be imported!' )
# =========================================================================
try : # ===================================================================
    # =====================================================================        
    import dbm.dumb
    row = 'dbm.dumb' , ''  , dbm.dumb.__file__
    rows.append  ( row )
    # =====================================================================
except ImportError : # ====================================================
    # =====================================================================
    row = attention ( 'dbm.dumb' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'dbm.dumb cannot be imported!' )
# ============================================================================
if python_info < ( 3 , 10) : # ================================================
    # =========================================================================
    try : # ===================================================================
        # =====================================================================        
        import bsddb3
        row = 'bsddb3' , ''  , bsddb3.__file__
        rows.append  ( row )
        # =====================================================================
    except ImportError : # ====================================================
        # =====================================================================
        row = attention ( 'bsddb3' ) , attention ( '---' ) , ''
        rows.append  ( row )
        # =====================================================================
    except : # ================================================================
        # =====================================================================
        logger.error ( 'bsddb3 cannot be imported!' )
# =============================================================================
if ( 3 , 13 ) <= python_info : # ==============================================
    # =========================================================================
    try : # ===================================================================
        # =====================================================================       
        import dbm.sqlite3
        row = 'dbm.sqlite3' , ''  , dbm.sqlite3.__file__
        rows.append  ( row )
        # ====================================================================
    except ImportError : # ===================================================
        # ====================================================================
        row = attention ( 'dbm.sqlite3' ) , attention ( '---' ) , ''
        rows.append  ( row )
    except : # ================================================================
        # =====================================================================
        logger.error ( 'dbm.sqlite3 cannot be imported!' )
# ============================================================================
try : # ===================================================================
    # =====================================================================        
    import berkeleydb
    row = 'berkeleydb' , berkeleydb.__version__  , berkeleydb.__file__
    rows.append  ( row )
    # =====================================================================
except ImportError : # ====================================================
    # =====================================================================
    row = attention ( 'berkeleydb' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'berkeleydb cannot be imported!' )
# =============================================================================
try : # ===================================================================
    # =====================================================================
    import tkrzw
    row = 'tkrzw' , ''  , tkrzw.__file__
    rows.append  ( row )        
    # =====================================================================
except ImportError : # ====================================================
    # =====================================================================
    row = attention ( 'tkrzw' ) , attention ( '---' ) , ''
    rows.append  ( row )            
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'tkrzw cannot be imported!' )
# =============================================================================
try : # =======================================================================
    # =========================================================================        
    import sqlite3
    version = getattr ( sqlite3 , 'sqlite_version' , '' ) 
    row = 'sqlite3' , version  , sqlite3.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError :
    # =========================================================================
    row = attention ( 'sqlite3' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'sqlite3 cannot be imported!' )
# =============================================================================
try : # =======================================================================
    # =========================================================================
    import pathos
    version = getattr ( pathos , '__version__' , '' ) 
    row = 'pathos' , version  , pathos.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    message = """pathos cannot be imported!
    Pathos is used for the paralellel `cluster'-processing
    - see https://github.com/uqfoundation/pathos
    - https://pathos.readthedocs.io
    Pathos suite consists of:
    - pathos
    - multiprocess
    - dill
    - ppft"""
    logger.warning ( message ) 
    row = attention ( 'pathos' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'pathos cannot be imported!' )
# =============================================================================                    
try : # =======================================================================
    # =========================================================================
    import dill
    row = 'dill' , dill.__version__  , dill.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    message = """dill (part of pathos-suite) cannot be imported!
    Dill provdies a powerful object serialization needed for the parallel processing
    - https://github.com/uqfoundation/dill
    - https://pathos.readthedocs.io"""
    logger.warning ( message )
    row = attention ( 'dill' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'dill cannot be imported!' )
# =============================================================================                  
try : # =======================================================================
    # =========================================================================
    import multiprocess
    version = getattr ( multiprocess , '__version__' , '' ) 
    row = 'multiprocess' , version  , multiprocess.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    message = """multiprocess (part of pathos-suite) cannot be imported!
    Multiprocess is used for the paralellel processing
    - https://github.com/uqfoundation/multiprocess
    - https://pathos.readthedocs.io"""
    logger.warning ( message )
    row = attention ( 'multiprocess' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'multiprocess cannot be imported!' )
# =============================================================================                    
try : # =======================================================================
    # =========================================================================
    import ppft
    version = getattr ( ppft , '__version__' , '' ) 
    row = 'ppft' , version  , ppft.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError :
    # =========================================================================
    message = """ppft (part of pathos-suite) cannot be imported!
    Ppft is a distributed and parallel python
    - https://github.com/uqfoundation/ppft
    - https://pathos.readthedocs.io"""
    logger.warning ( message )
    row = attention ( 'ppft' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'ppft cannot be imported!' )
# =============================================================================
try : # ===================================================================
    # =====================================================================        
    import ipyparallel        
    version = getattr ( ipyparallel , '__version__' , '' ) 
    row = 'ipyparallel' , version  , ipyparallel.__file__
    rows.append  ( row )
    # =====================================================================
except ImportError :
    # =====================================================================
    row = attention ( 'ipyparallel' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'ipyparalell cannot be imported!' )
# =============================================================================
try : # ===================================================================
    # =====================================================================        
    import joblib        
    version = getattr ( joblib , '__version__' , '' ) 
    row = 'joblib' , version , joblib.__file__
    rows.append  ( row )
    # =====================================================================
except ImportError :
    # =====================================================================
    message = """joblib cannot be imported!
    Joblb (optional) allows to speedup Goodness-of-Fit tests"""
    logger.warning ( message )
    row = attention ( 'joblib' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'joblib cannot be imported!' )
# ============================================================================
try : # ======================================================================
    # ========================================================================    
    import psutil
    version = getattr ( psutil, '__version__' , '' ) 
    row = 'psutil' , version , psutil.__file__
    rows.append  ( row )
    # ========================================================================
except ImportError : # =======================================================
    # ========================================================================
    message = """psutil cannot be imported! 
    psutil is recommended for memory monitoring
    - There is no local replacement
    - see https://github.com/giampaolo/psutil"""
    logger.error ( message )
    row = attention ( 'psutil' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'psutil cannot be imported!' )
# =============================================================================        
try : # =======================================================================
    # =========================================================================
    import more_itertools
    row = 'more_itertools' , '' , more_itertools.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    message = """more_itertools cannot be imported! 
    more_itertools is recommended for more efficient job splitting
    - There is a local replacement for ``chunked/divide/grouper''
    https://github.com/more-itertools/more-itertools"""
    logger.error ( message )
    row = attention ( 'more_itertools' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'more_itertools cannot be imported!' )
# =============================================================================
try : # =======================================================================
    # =========================================================================        
    import zstandard
    version = getattr ( zstandard , '__version__' , '' ) 
    row = 'zstandard' , version  , zstandard.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    row = attention ( 'zstandard' ) , attention ( '---' ) , ''
    rows.append  ( row ) 
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'zstandard  cannot be imported!' )
# =============================================================================
try : # =======================================================================
    # =========================================================================    
    import lzma
    row = 'lzma' , ''  , lzma.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    row = attention ( 'lzma' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'lzma cannot be imported!' )
# =============================================================================
has_tt3 = False
# =============================================================================
if ( 3 , 9 ) <= python_info : # ===============================================
    # =========================================================================
    try : # ===================================================================
        # =====================================================================        
        import terminaltables3
        has_tt3 = True 
        version = getattr ( terminaltables3 , '__version__' , '' ) 
        row = 'terminaltables3' , version  , terminaltables3.__file__
        rows.append  ( row )        
        # =====================================================================
    except ImportError : # ====================================================
        # =====================================================================
        row = attention ( 'terminaltables3' ) , attention ( '---' ) , ''
        rows.append  ( row )
        # =====================================================================
    except : # ================================================================
        # =====================================================================
        logger.error ( 'terminaltables3 cannot be imported!' )
# =============================================================================
if not has_tt3 : # ============================================================
    # =========================================================================
    try : # ===================================================================
        # =====================================================================        
        import terminaltables
        version = getattr ( terminaltables , '__version__' , '' ) 
        row = 'terminaltables' , version  , terminaltables.__file__
        rows.append  ( row )        
        # =====================================================================
    except ImportError : # ====================================================
        # =====================================================================
        row = attention ( 'terminaltables' ) , attention ( '---' ) , ''
        rows.append  ( row )
        # =====================================================================
    except : # ================================================================
        # =====================================================================
        logger.error ( 'terminaltables cannot be imported!' )
# =============================================================================                    
try : # =======================================================================
    # =========================================================================
    import tabulate
    version = getattr ( tabulate , '__version__' , '' ) 
    row = 'tabulate' , version  , tabulate.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    row = attention ( 'tabulate' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'tabulate cannot be imported!' )
# =============================================================================                  
try : # ======================================================================
    # ========================================================================    
    import sortedcontainers
    version = getattr ( sortedcontainers , '__version__' , '' ) 
    row = 'sortedcontainers' , version , sortedcontainers.__file__
    rows.append  ( row )
    # ========================================================================
except ImportError : # =======================================================
    # ========================================================================
    message = """sortedcontainers cannot be imported! 
     - There is no local replacement
     - see https://grantjenks.com/docs/sortedcontainers/sortedlist.html
     """
    logger.error ( message )
    row = attention ( 'sortedcontainers' ) , attention ( '---' ) , ''
    rows.append  ( row )   
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'sortedcontainers cannot  be imported!' )
# =============================================================================                  
try : # ======================================================================
    # ========================================================================    
    import pragmastat
    version = getattr ( pragmastat , '__version__' , '' ) 
    row = 'pragmastat' , version , pragmastat.__file__
    rows.append  ( row )
    # ========================================================================
except ImportError : # =======================================================
    # ========================================================================
    message = """pragmastat cannot be imported! 
    pragmastat is useful for robust statistical features
    - There is no local replacement
    - https://github.com/AndreyAkinshin/pragmastat
    - https://doi.org/10.5281/zenodo.17236778
    """
    logger.error ( message )
    row = attention ( 'pragmastat' ) , attention ( '---' ) , ''
    rows.append  ( row )   
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'pragmastat cannot be imported!' )
# =============================================================================        



try : # =======================================================================
    # =========================================================================
    import hep_ml
    row = 'hep_ml' , hep_ml.__version__  , hep_ml.__file__
    rows.append  ( row )
    # =========================================================================
except ImportError : # ========================================================
    # =========================================================================
    message = """hep_ml cannot be imported! 
    hep_ml is recommended for very efficient  multidimensional reweighting"""
    logger.error ( message ) 
    row = attention ( 'hep_ml' ) , attention ( '---' ) , ''
    rows.append  ( row )
    # =========================================================================
except : # ====================================================================
    # =========================================================================
    logger.error ( 'hep_ml cannot be imported!' )
# =============================================================================        

# =============================================================================
if '__main__' == __name__ : # =================================================
    # =========================================================================
    
    title = 'Ostap dependencies'
    import ostap.logger.table     as    T
    table = T.table ( rows , title = title , prefix = '# ' , alignment = 'lll' )
    logger.info ( '%s:\n%s' % ( title , table ) )


# =============================================================================
##                                                                      The END 
# =============================================================================
