#    Copyright 2016 Mirantis, Inc.
#
#    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.

import enum


@enum.unique
class SigNum(enum.IntEnum):
    SIGHUP = 1  # Hangup (POSIX).
    SIGINT = 2  # Interrupt (ANSI).
    SIGQUIT = 3  # Quit (POSIX).
    SIGILL = 4  # Illegal instruction (ANSI).
    SIGTRAP = 5  # Trace trap (POSIX).
    SIGABRT = 6  # Abort (ANSI).
    SIGBUS = 7  # BUS error (4.2 BSD).
    SIGFPE = 8  # Floating-point exception (ANSI).
    SIGKILL = 9  # Kill, unblockable (POSIX).
    SIGUSR1 = 10  # User-defined signal 1 (POSIX).
    SIGSEGV = 11  # Segmentation violation (ANSI).
    SIGUSR2 = 12  # User-defined signal 2 (POSIX).
    SIGPIPE = 13  # Broken pipe (POSIX).
    SIGALRM = 14  # Alarm clock (POSIX).
    SIGTERM = 15  # Termination (ANSI).
    SIGSTKFLT = 16  # Stack fault.
    SIGCHLD = 17  # Child status has changed (POSIX).
    SIGCONT = 18  # Continue (POSIX).
    SIGSTOP = 19  # Stop, unblockable (POSIX).
    SIGTSTP = 20  # Keyboard stop (POSIX).
    SIGTTIN = 21  # Background read from tty (POSIX).
    SIGTTOU = 22  # Background write to tty (POSIX).
    SIGURG = 23  # Urgent condition on socket (4.2 BSD).
    SIGXCPU = 24  # CPU limit exceeded (4.2 BSD).
    SIGXFSZ = 25  # File size limit exceeded (4.2 BSD).
    SIGVTALRM = 26  # Virtual alarm clock (4.2 BSD).
    SIGPROF = 27  # Profiling alarm clock (4.2 BSD).
    SIGWINCH = 28  # Window size change (4.3 BSD, Sun).
    SIGPOLL = 29  # Pollable event occurred (System V)
    SIGPWR = 30  # Power failure restart (System V).
    SIGSYS = 31  # Bad system call.

    def __str__(self):
        return "{name}<{value:d}(0x{value:02X})>".format(
            name=self.name,
            value=self.value
        )


@enum.unique
class ExitCodes(enum.IntEnum):
    EX_OK = 0  # successful termination

    EX_INVALID = 0xDEADBEEF  # uint32 debug value. Impossible for POSIX

    EX_ERROR = 1  # general failure
    EX_BUILTIN = 2  # Misuse of shell builtins (according to Bash)

    EX_USAGE = 64  # command line usage error
    EX_DATAERR = 65  # data format error
    EX_NOINPUT = 66  # cannot open input
    EX_NOUSER = 67  # addressee unknown
    EX_NOHOST = 68  # host name unknown
    EX_UNAVAILABLE = 69  # service unavailable
    EX_SOFTWARE = 70  # internal software error
    EX_OSERR = 71  # system error (e.g., can't fork)
    EX_OSFILE = 72  # critical OS file missing
    EX_CANTCREAT = 73  # can't create (user) output file
    EX_IOERR = 74  # input/output error
    EX_TEMPFAIL = 75  # temp failure; user is invited to retry
    EX_PROTOCOL = 76  # remote error in protocol
    EX_NOPERM = 77  # permission denied
    EX_CONFIG = 78  # configuration error

    EX_NOEXEC = 126  # If a command is found but is not executable
    EX_NOCMD = 127  # If a command is not found

    # Signal exits:
    EX_SIGHUP = 128 + SigNum.SIGHUP
    EX_SIGINT = 128 + SigNum.SIGINT
    EX_SIGQUIT = 128 + SigNum.SIGQUIT
    EX_SIGILL = 128 + SigNum.SIGILL
    EX_SIGTRAP = 128 + SigNum.SIGTRAP
    EX_SIGABRT = 128 + SigNum.SIGABRT
    EX_SIGBUS = 128 + SigNum.SIGBUS
    EX_SIGFPE = 128 + SigNum.SIGFPE
    EX_SIGKILL = 128 + SigNum.SIGKILL
    EX_SIGUSR1 = 128 + SigNum.SIGUSR1
    EX_SIGSEGV = 128 + SigNum.SIGSEGV
    EX_SIGUSR2 = 128 + SigNum.SIGUSR2
    EX_SIGPIPE = 128 + SigNum.SIGPIPE
    EX_SIGALRM = 128 + SigNum.SIGALRM
    EX_SIGTERM = 128 + SigNum.SIGTERM
    EX_SIGSTKFLT = 128 + SigNum.SIGSTKFLT
    EX_SIGCHLD = 128 + SigNum.SIGCHLD
    EX_SIGCONT = 128 + SigNum.SIGCONT
    EX_SIGSTOP = 128 + SigNum.SIGSTOP
    EX_SIGTSTP = 128 + SigNum.SIGTSTP
    EX_SIGTTIN = 128 + SigNum.SIGTTIN
    EX_SIGTTOU = 128 + SigNum.SIGTTOU
    EX_SIGURG = 128 + SigNum.SIGURG
    EX_SIGXCPU = 128 + SigNum.SIGXCPU
    EX_SIGXFSZ = 128 + SigNum.SIGXFSZ
    EX_SIGVTALRM = 128 + SigNum.SIGVTALRM
    EX_SIGPROF = 128 + SigNum.SIGPROF
    EX_SIGWINCH = 128 + SigNum.SIGWINCH
    EX_SIGPOLL = 128 + SigNum.SIGPOLL
    EX_SIGPWR = 128 + SigNum.SIGPWR
    EX_SIGSYS = 128 + SigNum.SIGSYS

    def __str__(self):
        return "{name}<{value:d}(0x{value:02X})>".format(
            name=self.name,
            value=self.value
        )
