"""visaacceptancemergedspec.

This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ).
"""

# ruff: noqa: E501
from visaacceptancemergedspec.api_helper import (
    APIHelper,
)


class Emv(object):
    """Implementation of the 'Emv' model.

    Attributes:
        tags (str): EMV data that is transmitted from the chip card to the issuer,
            and from the issuer to the chip card. The EMV data is in the
            tag-length-value format and includes chip card tags, terminal tags, and
            transaction detail tags.  For information about the individual tags, see
            the “Application Specification” section in the EMV 4.3 Specifications:
            **Note** Card present information about EMV applies only to credit card
            processing and PIN debit processing. All other card present information
            applies only to credit card processing. PIN debit processing is available
            only on FDC Nashville Global.  **Important** The following tags contain
            sensitive information and **must not** be included in this field:   -
            `56`: Track 1 equivalent data  - `57`: Track 2 equivalent data  - `5A`:
            Application PAN  - `5F20`: Cardholder name  - `5F24`: Application
            expiration date (This sensitivity has been relaxed for Credit Mutuel-CIC,
            American Express Direct, FDC Nashville Global, First Data Merchant
            Solutions, and SIX)  - `99`: Transaction PIN  - `9F0B`: Cardholder name
            (extended)  - `9F1F`: Track 1 discretionary data  - `9F20`: Track 2
            discretionary data  For captures, this field is required for contact EMV
            transactions. Otherwise, it is optional.  For credits, this field is
            required for contact EMV stand-alone credits and contactless EMV
            stand-alone credits. Otherwise, it is optional.  **Important** For
            contact EMV captures, contact EMV stand-alone credits, and contactless
            EMV stand-alone credits, you must include the following tags in this
            field. For all other types of EMV transactions, the following tags are
            optional.   - `95`: Terminal verification results  - `9F10`: Issuer
            application data  - `9F26`: Application cryptogram   #### Visa Acceptance
            through VisaNet - In Japan: 199 bytes - In other countries: String (252)
            For Mastercard Transactions, Optionally Tag 9F60 (Authenticated
            Application Data) and  Tag 96 (Kernel Identifier - Terminal) can be
            included in the Field.  #### GPX This field only supports transactions
            from the following card types: - Visa - Mastercard - AMEX - Discover -
            Diners - JCB - Union Pay International  #### JCN Gateway The following
            tags must be included: - `4F`: Application identifier - `84`: Dedicated
            file name  Data length: 199 bytes  #### All other processors: String
            (999)  #### Used by Authorization: Optional Authorization Reversal:
            Optional Credit: Optional PIN Debit processing (purchase, credit and
            reversal): Optional
        cardholder_verification_method_used (int): Method that was used to verify the
            cardholder's identity.  Possible values:  - `0`: No verification  - `1`:
            Signature  This field is supported only on **American Express Direct**.
        card_sequence_number (str): Number assigned to a specific card when two or
            more cards are associated with the same primary account number.  This
            value enables issuers to distinguish among multiple cards that are linked
            to the same account.  This value can also act as a tracking tool when
            reissuing cards.   When this value is available, it is provided by the
            chip reader.   When the chip reader does not provide this value, do not
            include this field in your request.  When sequence number is not provided
            via this API field, the value is extracted from EMV tag 5F34 for Visa and
            Mastercard transactions. To enable this feature please call support.
            **Note** Card present information about EMV applies only to credit card
            processing and PIN debit processing.  All other card present information
            applies only to credit card processing.   PIN debit processing is
            available only on Visa Acceptance through VisaNet and FDC Nashville
            Global.  #### Used by Authorization: Optional PIN Debit processing:
            Optional  #### GPX  This field only supports transactions from the
            following card types: - Visa - Mastercard - AMEX - Discover - Diners -
            JCB - Union Pay International
        fallback (bool): Indicates whether a fallback method was used to enter credit
            card information into the POS terminal. When a technical problem prevents
            a successful exchange of information between a chip card and a
            chip-capable terminal:   1. Swipe the card or key the credit card
            information into the POS terminal.  2. Use the
            pointOfSaleInformation.entryMode field to indicate whether the
            information was swiped or keyed.   Possible values: - `true`: Fallback
            method was used. - `false` (default): Fallback method was not used.  This
            field is supported only on American Express Direct, Chase Paymentech
            Solutions, Visa Acceptance through VisaNet, FDC Nashville Global, GPN,
            JCN Gateway, OmniPay Direct, and SIX.
        fallback_condition (int): Reason for the EMV fallback transaction. An EMV
            fallback transaction occurs when an EMV transaction fails for one of
            these reasons:   - Technical failure: the EMV terminal or EMV card cannot
            read and process chip data.  - Empty candidate list failure: the EMV
            terminal does not have any applications in common with the EMV card.
            EMV terminals are coded to determine whether the terminal and EMV card
            have any applications in common.    EMV terminals provide this
            information to you.  Possible values:   - `1`: Transaction was initiated
            with information from a magnetic stripe, and the previous transaction at
            the     EMV terminal either used information from a successful chip read
            or it was not a chip transaction.  - `2`: Transaction was initiated with
            information from a magnetic stripe, and the previous transaction at the
            EMV terminal was an EMV fallback transaction because the attempted chip
            read was unsuccessful.  This field is supported only on **GPN** and **JCN
            Gateway**. **NOTE**: This field is required when an EMV transaction fails
            for a technical reason. Do not include this field when the EMV terminal
            does not have any applications in common with the EMV card.
        is_repeat (bool): #### Visa Platform Connect Value “true” indicates this
            transaction is intentionally duplicated . The field contains value “true”
            which indicates that merchant has intentionally duplicated single tap
            transaction. Merchant is intentionally sending a duplicate auth request
            for a single tap txn because the issuer requested a PIN.
        additional_properties (Dict[str, Any]): The additional properties for the
            model.

    """

    # Create a mapping from Model property names to API property names
    _names = {
        "tags": "tags",
        "cardholder_verification_method_used": "cardholderVerificationMethodUsed",
        "card_sequence_number": "cardSequenceNumber",
        "fallback": "fallback",
        "fallback_condition": "fallbackCondition",
        "is_repeat": "isRepeat",
    }

    _optionals = [
        "tags",
        "cardholder_verification_method_used",
        "card_sequence_number",
        "fallback",
        "fallback_condition",
        "is_repeat",
    ]

    def __init__(
        self,
        tags=APIHelper.SKIP,
        cardholder_verification_method_used=APIHelper.SKIP,
        card_sequence_number=APIHelper.SKIP,
        fallback=APIHelper.SKIP,
        fallback_condition=APIHelper.SKIP,
        is_repeat=APIHelper.SKIP,
        additional_properties=None):
        """Initialize a Emv instance."""
        # Initialize members of the class
        if tags is not APIHelper.SKIP:
            self.tags = tags
        if cardholder_verification_method_used is not APIHelper.SKIP:
            self.cardholder_verification_method_used =\
                 cardholder_verification_method_used
        if card_sequence_number is not APIHelper.SKIP:
            self.card_sequence_number = card_sequence_number
        if fallback is not APIHelper.SKIP:
            self.fallback = fallback
        if fallback_condition is not APIHelper.SKIP:
            self.fallback_condition = fallback_condition
        if is_repeat is not APIHelper.SKIP:
            self.is_repeat = is_repeat

        # Add additional model properties to the instance
        if additional_properties is None:
            additional_properties = {}
        self.additional_properties = additional_properties

    @classmethod
    def from_dictionary(cls,
                        dictionary):
        """Create an instance of this model from a dictionary

        Args:
            dictionary (dictionary): A dictionary representation of the object
            as obtained from the deserialization of the server's response. The
            keys MUST match property names in the API description.

        Returns:
            object: An instance of this structure class.

        """
        if not isinstance(dictionary, dict) or dictionary is None:
            return None

        # Extract variables from the dictionary
        tags =\
            dictionary.get("tags")\
            if dictionary.get("tags")\
                else APIHelper.SKIP
        cardholder_verification_method_used =\
            dictionary.get("cardholderVerificationMethodUsed")\
            if dictionary.get("cardholderVerificationMethodUsed")\
                else APIHelper.SKIP
        card_sequence_number =\
            dictionary.get("cardSequenceNumber")\
            if dictionary.get("cardSequenceNumber")\
                else APIHelper.SKIP
        fallback =\
            dictionary.get("fallback")\
            if "fallback" in dictionary.keys()\
                else APIHelper.SKIP
        fallback_condition =\
            dictionary.get("fallbackCondition")\
            if dictionary.get("fallbackCondition")\
                else APIHelper.SKIP
        is_repeat =\
            dictionary.get("isRepeat")\
            if "isRepeat" in dictionary.keys()\
                else APIHelper.SKIP

        additional_properties = APIHelper.get_additional_properties(
            dictionary={k: v for k, v in dictionary.items()
                        if k not in cls._names.values()},
            unboxing_function=lambda value: value)

        # Return an object of this model
        return cls(tags,
                   cardholder_verification_method_used,
                   card_sequence_number,
                   fallback,
                   fallback_condition,
                   is_repeat,
                   additional_properties)

    def __repr__(self):
        """Return a unambiguous string representation."""
        _tags=(
            self.tags
            if hasattr(self, "tags")
            else None
        )
        _cardholder_verification_method_used=(
            self.cardholder_verification_method_used
            if hasattr(self, "cardholder_verification_method_used")
            else None
        )
        _card_sequence_number=(
            self.card_sequence_number
            if hasattr(self, "card_sequence_number")
            else None
        )
        _fallback=(
            self.fallback
            if hasattr(self, "fallback")
            else None
        )
        _fallback_condition=(
            self.fallback_condition
            if hasattr(self, "fallback_condition")
            else None
        )
        _is_repeat=(
            self.is_repeat
            if hasattr(self, "is_repeat")
            else None
        )
        _additional_properties=self.additional_properties
        return (
            f"{self.__class__.__name__}("
            f"tags={_tags!r}, "
            f"cardholder_verification_method_used={_cardholder_verification_method_used!r}, "
            f"card_sequence_number={_card_sequence_number!r}, "
            f"fallback={_fallback!r}, "
            f"fallback_condition={_fallback_condition!r}, "
            f"is_repeat={_is_repeat!r}, "
            f"additional_properties={_additional_properties!r}, "
            f")"
        )

    def __str__(self):
        """Return a human-readable string representation."""
        _tags=(
            self.tags
            if hasattr(self, "tags")
            else None
        )
        _cardholder_verification_method_used=(
            self.cardholder_verification_method_used
            if hasattr(self, "cardholder_verification_method_used")
            else None
        )
        _card_sequence_number=(
            self.card_sequence_number
            if hasattr(self, "card_sequence_number")
            else None
        )
        _fallback=(
            self.fallback
            if hasattr(self, "fallback")
            else None
        )
        _fallback_condition=(
            self.fallback_condition
            if hasattr(self, "fallback_condition")
            else None
        )
        _is_repeat=(
            self.is_repeat
            if hasattr(self, "is_repeat")
            else None
        )
        _additional_properties=self.additional_properties
        return (
            f"{self.__class__.__name__}("
            f"tags={_tags!s}, "
            f"cardholder_verification_method_used={_cardholder_verification_method_used!s}, "
            f"card_sequence_number={_card_sequence_number!s}, "
            f"fallback={_fallback!s}, "
            f"fallback_condition={_fallback_condition!s}, "
            f"is_repeat={_is_repeat!s}, "
            f"additional_properties={_additional_properties!s}, "
            f")"
        )
