# Copyright 2017 The Tulsi Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the 'License');
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an 'AS IS' BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Logging routines used by Tulsi scripts."""

import logging
import logging.handlers
import os
import sys


class Logger(object):
  """Tulsi specific logging."""

  def __init__(self):
    logging_dir = os.path.expanduser('~/Library/Application Support/Tulsi')
    if not os.path.exists(logging_dir):
      os.mkdir(logging_dir)

    logfile = os.path.join(logging_dir, 'build_log.txt')

    # Currently only creates a single logger called 'tulsi_logging'. If
    # additional loggers are needed, consider adding a name attribute to the
    # Logger.
    self._logger = logging.getLogger('tulsi_logging')
    self._logger.setLevel(logging.INFO)

    try:
      file_handler = logging.handlers.RotatingFileHandler(logfile,
                                                          backupCount=20)
      file_handler.setLevel(logging.INFO)
      # Create a new log file for each build.
      file_handler.doRollover()
      self._logger.addHandler(file_handler)
    except (IOError, OSError) as err:
      filename = 'none'
      if hasattr(err, 'filename'):
        filename = err.filename
      sys.stderr.write('Failed to set up logging to file: %s (%s).\n' %
                       (os.strerror(err.errno), filename))
      sys.stderr.flush()

    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    self._logger.addHandler(console)

  def log_action(self, action_name, action_id, seconds):
    del action_id  # Unused by this logger.
    # Log to file and print to stdout for display in the Xcode log.
    self._logger.info('<*> %s completed in %0.3f ms',
                      action_name, seconds * 1000)
