# -*- coding: utf-8 -*-
# mypy: disable-error-code=assignment
# pylint: disable=line-too-long,consider-using-f-string
"""FTP Server Return Code
============================
.. module:: pcapkit.const.ftp.return_code
This module contains the constant enumeration for **FTP Server Return Code**,
which is automatically generated from :class:`pcapkit.vendor.ftp.return_code.ReturnCode`.
"""
from typing import TYPE_CHECKING
from aenum import IntEnum, extend_enum
if TYPE_CHECKING:
    from typing import Optional, Type
__all__ = ['ReturnCode']
#: Grouping information.
INFO = {
    '0': 'Syntax',
    '1': 'Information',
    '2': 'Connections',
    '3': 'Authentication and accounting',
    '4': 'Unspecified',                     # [RFC 959]
    '5': 'File system',
}  # type: dict[str, str]
class ResponseKind(IntEnum):
    """Response kind; whether the response is good, bad or incomplete."""
    PositivePreliminary = 1
    PositiveCompletion = 2
    PositiveIntermediate = 3
    TransientNegativeCompletion = 4
    PermanentNegativeCompletion = 5
    Protected = 6
    def _missing_(cls, value: 'int') -> 'ResponseKind':
        """Lookup function used when value is not found.
        Args:
            value: Value to lookup.
        """
        if isinstance(value, int) and 0 <= value <= 9:
            return extend_enum(cls, 'Unknown_%d' % value, value)
        return super()._missing_(value)
class GroupingInformation(IntEnum):
    """Grouping information."""
    Syntax = 0
    Information = 1
    Connections = 2
    AuthenticationAccounting = 3
    Unspecified = 4
    FileSystem = 5
    def _missing_(cls, value: 'int') -> 'GroupingInformation':
        """Lookup function used when value is not found.
        Args:
            value: Value to lookup.
        """
        if isinstance(value, int) and 0 <= value <= 9:
            return extend_enum(cls, 'Unknown_%d' % value, value)
        return super()._missing_(value)
[docs]
class ReturnCode(IntEnum):
    """[ReturnCode] FTP Server Return Code"""
    if TYPE_CHECKING:
        #: Description of the return code.
        description: 'Optional[str]'
        #: Response kind.
        kind: 'ResponseKind'
        #: Grouping information.
        group: 'GroupingInformation'
    def __new__(cls, value: 'int', description: 'Optional[str]' = None) -> 'Type[ReturnCode]':
        obj = int.__new__(cls, value)
        obj._value_ = value
        code = str(value)
        obj.description = description
        obj.kind = ResponseKind(int(code[0]))
        obj.group = GroupingInformation(int(code[1]))
        return obj
    def __repr__(self) -> 'str':
        return "<%s [%s]>" % (self.__class__.__name__, self._value_)
    def __str__(self) -> 'str':
        return "[%s] %s" % (self._value_, self.description)
    #: Restart marker replay. In this case, the text is exact and not left to the
    #: particular implementation; it must read: MARK yyyy = mmmm where yyyy is
    #: User-process data stream marker, and mmmm server's equivalent marker (note
    #: the spaces between markers and "=").
    CODE_110: 'ReturnCode' = 110, 'Restart marker replay.'
    #: Service ready in nnn minutes.
    CODE_120: 'ReturnCode' = 120, 'Service ready in nnn minutes.'
    #: Data connection already open; transfer starting.
    CODE_125: 'ReturnCode' = 125, 'Data connection already open; transfer starting.'
    #: File status okay; about to open data connection.
    CODE_150: 'ReturnCode' = 150, 'File status okay; about to open data connection.'
    #: Command not implemented, superfluous at this site.
    CODE_202: 'ReturnCode' = 202, 'Command not implemented, superfluous at this site.'
    #: System status, or system help reply.
    CODE_211: 'ReturnCode' = 211, 'System status, or system help reply.'
    #: Directory status.
    CODE_212: 'ReturnCode' = 212, 'Directory status.'
    #: File status.
    CODE_213: 'ReturnCode' = 213, 'File status.'
    #: Help message. Explains how to use the server or the meaning of a particular
    #: non-standard command. This reply is useful only to the human user.
    CODE_214: 'ReturnCode' = 214, 'Help message.'
    #: NAME system type. Where NAME is an official system name from the registry
    #: kept by IANA.
    CODE_215: 'ReturnCode' = 215, 'NAME system type.'
    #: Service ready for new user.
    CODE_220: 'ReturnCode' = 220, 'Service ready for new user.'
    #: Service closing control connection. Logged out if appropriate.
    CODE_221: 'ReturnCode' = 221, 'Service closing control connection.'
    #: Data connection open; no transfer in progress.
    CODE_225: 'ReturnCode' = 225, 'Data connection open; no transfer in progress.'
    #: Closing data connection. Requested file action successful (for example, file
    #: transfer or file abort).
    CODE_226: 'ReturnCode' = 226, 'Closing data connection.'
    #: Entering Passive Mode (h1,h2,h3,h4,p1,p2).
    CODE_227: 'ReturnCode' = 227, 'Entering Passive Mode.'
    #: Entering Long Passive Mode (long address, port).
    CODE_228: 'ReturnCode' = 228, 'Entering Long Passive Mode.'
    #: Entering Extended Passive Mode (|||port|).
    CODE_229: 'ReturnCode' = 229, 'Entering Extended Passive Mode.'
    #: User logged in, proceed.
    CODE_230: 'ReturnCode' = 230, 'User logged in, proceed.'
    #: User logged in, authorized by security data exchange.
    CODE_232: 'ReturnCode' = 232, 'User logged in, authorized by security data exchange.'
    #: Server accepts the security mechanism specified by the client; no security
    #: data needs to be exchanged.
    CODE_234: 'ReturnCode' = 234, 'Server accepts the security mechanism specified by the client; no security data needs to be exchanged.'
    #: Server accepts the security data given by the client; no further security
    #: data needs to be exchanged.
    CODE_235: 'ReturnCode' = 235, 'Server accepts the security data given by the client; no further security data needs to be exchanged.'
    #: Requested file action was okay, completed.
    CODE_250: 'ReturnCode' = 250, 'Requested file action was okay, completed.'
    #: User name okay, password needed.
    CODE_331: 'ReturnCode' = 331, 'User name okay, password needed.'
    #: No need account for login.
    CODE_332: 'ReturnCode' = 332, 'No need account for login.'
    #: Server accepts the security mechanism specified by the client; some security
    #: data needs to be exchanged.
    CODE_334: 'ReturnCode' = 334, 'Server accepts the security mechanism specified by the client; some security data needs to be exchanged.'
    #: Username okay, password okay. Challenge is ". . . . ".
    CODE_336: 'ReturnCode' = 336, 'Username okay, password okay.'
    #: Service NOT available, closing control connection. This may be a reply to
    #: any command if the service knows it must shut down.
    CODE_421: 'ReturnCode' = 421, 'Service NOT available, closing control connection.'
    #: Can't open data connection.
    CODE_425: 'ReturnCode' = 425, "Can't open data connection."
    #: Connection closed; transfer aborted.
    CODE_426: 'ReturnCode' = 426, 'Connection closed; transfer aborted.'
    #: Invalid username or password
    CODE_430: 'ReturnCode' = 430, 'Invalid username or password.'
    #: Need some unavailable resource to process security.
    CODE_431: 'ReturnCode' = 431, 'Need some unavailable resource to process security.'
    #: Requested host unavailable.
    CODE_434: 'ReturnCode' = 434, 'Requested host unavailable.'
    #: Requested file action not taken.
    CODE_450: 'ReturnCode' = 450, 'Requested file action not taken.'
    #: Requested action aborted. Local error in processing.
    CODE_451: 'ReturnCode' = 451, 'Requested action aborted.'
    #: Requested action not taken. Insufficient storage space in system. File
    #: unavailable (e.g., file busy).
    CODE_452: 'ReturnCode' = 452, 'Requested action not taken.'
    #: Syntax error in parameters or arguments.
    CODE_501: 'ReturnCode' = 501, 'Syntax error in parameters or arguments.'
    #: Command not implemented.
    CODE_502: 'ReturnCode' = 502, 'Command not implemented.'
    #: Bad sequence of commands.
    CODE_503: 'ReturnCode' = 503, 'Bad sequence of commands.'
    #: Command not implemented for that parameter.
    CODE_504: 'ReturnCode' = 504, 'Command not implemented for that parameter.'
    #: Not logged in.
    CODE_530: 'ReturnCode' = 530, 'Not logged in.'
    #: Need account for storing files.
    CODE_532: 'ReturnCode' = 532, 'Need account for storing files.'
    #: Command protection level denied for policy reasons.
    CODE_533: 'ReturnCode' = 533, 'Command protection level denied for policy reasons.'
    #: Request denied for policy reasons.
    CODE_534: 'ReturnCode' = 534, 'Request denied for policy reasons.'
    #: Failed security check.
    CODE_535: 'ReturnCode' = 535, 'Failed security check.'
    #: Data protection level not supported by security mechanism.
    CODE_536: 'ReturnCode' = 536, 'Data protection level not supported by security mechanism.'
    #: Command protection level not supported by security mechanism.
    CODE_537: 'ReturnCode' = 537, 'Command protection level not supported by security mechanism.'
    #: Requested action not taken. File unavailable (e.g., file not found, no
    #: access).
    CODE_550: 'ReturnCode' = 550, 'Requested action not taken.'
    #: Requested action aborted. Page type unknown.
    CODE_551: 'ReturnCode' = 551, 'Requested action aborted.'
    #: Requested file action aborted. Exceeded storage allocation (for current
    #: directory or dataset).
    CODE_552: 'ReturnCode' = 552, 'Requested file action aborted.'
    #: Requested action not taken. File name not allowed.
    CODE_553: 'ReturnCode' = 553, 'Requested action not taken.'
    #: Integrity protected reply.
    CODE_631: 'ReturnCode' = 631, 'Integrity protected reply.'
    #: Confidentiality and integrity protected reply.
    CODE_632: 'ReturnCode' = 632, 'Confidentiality and integrity protected reply.'
    #: Confidentiality protected reply.
    CODE_633: 'ReturnCode' = 633, 'Confidentiality protected reply.'
    @staticmethod
    def get(key: 'int | str', default: 'int' = -1) -> 'ReturnCode':
        """Backport support for original codes.
        Args:
            key: Key to get enum item.
            default: Default value if not found.
        :meta private:
        """
        if isinstance(key, int):
            return ReturnCode(key)
        if key not in ReturnCode._member_map_:  # pylint: disable=no-member
            return extend_enum(ReturnCode, key, default)
        return ReturnCode[key]  # type: ignore[misc]
[docs]
    @classmethod
    def _missing_(cls, value: 'int') -> 'ReturnCode':
        """Lookup function used when value is not found.
        Args:
            value: Value to get enum item.
        """
        if not (isinstance(value, int) and 100 <= value <= 659):
            raise ValueError('%r is not a valid %s' % (value, cls.__name__))
        return extend_enum(cls, 'CODE_%s' % value, value)