#!/usr/bin/env python3
#
#  Copyright (C) 2017 Codethink Limited
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public
#  License as published by the Free Software Foundation; either
#  version 2 of the License, or (at your option) any later version.
#
#  This library 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
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this library. If not, see <http://www.gnu.org/licenses/>.
#
#  Authors:
#        Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>

import datetime
import os


# Types of status messages.
#
class MessageType():
    DEBUG = "debug"        # Debugging message
    STATUS = "status"      # Status message, verbose details
    INFO = "info"          # Informative messages
    WARN = "warning"       # Warning messages
    ERROR = "error"        # Error messages
    BUG = "bug"            # An unhandled exception was raised in a plugin
    LOG = "log"            # Messages for log files _only_, never in the frontend

    # Timed Messages: SUCCESS and FAIL have duration timestamps
    START = "start"        # Status start message
    SUCCESS = "success"    # Successful status complete message
    FAIL = "failure"       # Failing status complete message


# Messages which should be reported regardless of whether
# they are currently silenced or not
unconditional_messages = [
    MessageType.INFO,
    MessageType.WARN,
    MessageType.FAIL,
    MessageType.ERROR,
    MessageType.BUG
]


# Message object
#
class Message():

    def __init__(self, unique_id, message_type, message,
                 task_id=None,
                 detail=None,
                 action_name=None,
                 elapsed=None,
                 depth=None,
                 logfile=None,
                 sandbox=None,
                 scheduler=False):
        self.message_type = message_type  # Message type
        self.message = message            # The message string
        self.detail = detail              # An additional detail string
        self.action_name = action_name    # Name of the task queue (fetch, refresh, build, etc)
        self.elapsed = elapsed            # The elapsed time, in timed messages
        self.depth = depth                # The depth of a timed message
        self.logfile = logfile            # The log file path where commands took place
        self.sandbox = sandbox            # The sandbox directory where an error occurred (if any)
        self.pid = os.getpid()            # The process pid
        self.unique_id = unique_id        # The plugin object ID issueing the message
        self.task_id = task_id            # The plugin object ID of the task
        self.scheduler = scheduler        # Whether this is a scheduler level message
        self.creation_time = datetime.datetime.now()
        if message_type in (MessageType.SUCCESS, MessageType.FAIL):
            assert elapsed is not None
