#!/usr/bin/env python

import os
import LogSimTk 

globalLogReference = None

class BaseObjectSimTk:
   """Base class"""

   # -------------------------------------------------------------------------------------------------

   def __init__( self ):
      """Constructor for Base class"""

      self._logReference                  = None
      self._errorMessageFileName          = None
      self._errorMessageWritten           = 0
      self._printErrorMessages            = 1
      self._machineEpsilon                = 1.0e-05
      self._filePathSeparator             = os.sep
      self._endOfLine                     = os.linesep

   # -------------------------------------------------------------------------------------------------

   # accessors for logging reference 

   def setLogReference( self, inputLogReference ):
      """Set accessor for log reference"""
      self._logReference = inputLogReference

   def getLogReference( self, logFileName = 'Log.log', applicationName = 'Isim'):

      """Get accessor for log reference"""

      # globalLogReference is used as singleton

      global globalLogReference
      if self._logReference == None or globalLogReference == None:
         globalLogReference  = LogSimTk.getLogReference( logFileName, applicationName )
         self._logReference  = globalLogReference

      return self._logReference

   # -------------------------------------------------------------------------------------------------

   # accessors for machine epsilon

   def setMachineEpsilon( self, inputMachineEpsilon ):
      """Set accessor for machine epsilon"""
      self._machineEpsilon = inputMachineEpsilon

   def getMachineEpsilon( self ):
      """Get accessor for machine epsilon"""
      return self._machineEpsilon

   # -------------------------------------------------------------------------------------------------

   # accessors for end-of-line

   def setEndOfLine( self, inputEndOfLine ):
      """Set accessor for end-of-line"""
      self._endOfLine = inputEndOfLine

   def getEndOfLine( self ):
      """Get accessor for end-of-line"""
      return self._endOfLine

   # -------------------------------------------------------------------------------------------------

   # accessors for file path separator

   def setFilePathSeparator( self, inputFilePathSeparator ):
      """Set accessor for filePathSeparator"""
      self._filePathSeparator= inputFilePathSeparator

   def getFilePathSeparator( self ):
      """Get accessor for filePathSeparator"""
      return self._filePathSeparator

   # -------------------------------------------------------------------------------------------------

   # write error message

   def writeErrorMessage( self, errorMessage ): # {
      """Write error message to file"""
      if self._errorMessageWritten:
         mode = "a"
      else:
         mode = "w"
         self._errorMessageWritten = 1
                                 
      try:    
         errorMessageFile = open( self.getErrorMessageFileName(), mode )
      except IOError:
         self.getLogReference().error( ' file=<' + self.getErrorMessageFileName() + '> could not be opened.' );
         return None

      if self.getLogReference() is not None:
         self.getLogReference().error( errorMessage )

      errorMessageFile.write( errorMessage )
      errorMessageFile.close()

   # } end of writeErrorMessage

   # -------------------------------------------------------------------------------------------------

   # get error message file name

   def getErrorMessageFileName( self ): # {
      """Get error message file name"""
      if self._errorMessageFileName is None:
         self._errorMessageFileName = 'Error.txt'
      
      return self._errorMessageFileName

   # } end of getErrorMessageFileName

   # -------------------------------------------------------------------------------------------------

   # set error message

   def setErrorMessageFileName( self, errorMessageFileName ): # {
      """Get error message file name"""
      self._errorMessageFileName = errorMessageFileName

   # } end of setErrorMessageFileName

   # -------------------------------------------------------------------------------------------------

   # print error message flag

   def printErrorMessages( self ): # {
      """Print error messages flag """
      return self._printErrorMessages

   # } end of printErrorMessageFileName

   # -------------------------------------------------------------------------------------------------

   # set print error message flag

   def setPrintErrorMessages( self, printErrorMessages ): # {
      """Set print error message flag"""
      self._printErrorMessages = printErrorMessages
   # } end of printErrorMessageFlag

   # -------------------------------------------------------------------------------------------------

   # check that files exist

   def doFilesExist( self, fileList, printErrorMessage = 0 ): # {

      """Check if all files in fileList exists. If any are not present,
         print error message to error file (if printErrorMessage flag is set) and
         log error message to log file if available."""

      errorList = []
      for file in fileList:
         if not os.path.exists( file ):
            errorList.append( file )

      if len( errorList ) > 0:
         errorMessage = 'The following files are missing:\n';
         for file in errorList:
            errorMessage += '    ' + file + '\n'

         if printErrorMessage:
            self.writeErrorMessage( errorMessage )

         if self.getLogReference():
            self.getLogReference().error( errorMessage );

         return 0
      else:
         self.getLogReference().info( 'All files present.' );
         return 1

   # } end of doFilesExist

   # -------------------------------------------------------------------------------------------------
