<?php
/**
 * Ptsv2paymentsPaymentInformation
 *
 * PHP version 5
 *
 * @category Class
 * @package  CyberSource
 * @author   Swaagger Codegen team
 * @link     https://github.com/swagger-api/swagger-codegen
 */

/**
 * CyberSource Merged Spec
 *
 * All CyberSource API specs merged together. These are available at https://developer.cybersource.com/api/reference/api-reference.html
 *
 * OpenAPI spec version: 0.0.1
 * 
 * Generated by: https://github.com/swagger-api/swagger-codegen.git
 *
 */
/**
 * NOTE: This class is auto generated by the swagger code generator program.
 * https://github.com/swagger-api/swagger-codegen
 * Do not edit the class manually.
 */

namespace CyberSource\Model;

use \ArrayAccess;

/**
 * Ptsv2paymentsPaymentInformation Class Doc Comment
 *
 * @category    Class
 * @package     CyberSource
 * @author      Swagger Codegen team
 * @link        https://github.com/swagger-api/swagger-codegen
 */
class Ptsv2paymentsPaymentInformation implements ArrayAccess
{
    const DISCRIMINATOR = null;

    /**
      * The original name of the model.
      * @var string
      */
    protected static $swaggerModelName = 'ptsv2payments_paymentInformation';

    /**
      * Array of property to type mappings. Used for (de)serialization
      * @var string[]
      */
    protected static $swaggerTypes = [
        'card' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationCard',
        'tokenizedCard' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationTokenizedCard',
        'directDebit' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationDirectDebit',
        'fluidData' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationFluidData',
        'customer' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationCustomer',
        'paymentInstrument' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationPaymentInstrument',
        'instrumentIdentifier' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationInstrumentIdentifier',
        'shippingAddress' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationShippingAddress',
        'legacyToken' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationLegacyToken',
        'bank' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationBank',
        'options' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationOptions',
        'paymentType' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationPaymentType',
        'initiationChannel' => 'string',
        'sepa' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationSepa',
        'eWallet' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationEWallet',
        'paymentAccountReference' => '\CyberSource\Model\Ptsv2paymentsPaymentInformationPaymentAccountReference'
    ];

    /**
      * Array of property to format mappings. Used for (de)serialization
      * @var string[]
      */
    protected static $swaggerFormats = [
        'card' => null,
        'tokenizedCard' => null,
        'directDebit' => null,
        'fluidData' => null,
        'customer' => null,
        'paymentInstrument' => null,
        'instrumentIdentifier' => null,
        'shippingAddress' => null,
        'legacyToken' => null,
        'bank' => null,
        'options' => null,
        'paymentType' => null,
        'initiationChannel' => null,
        'sepa' => null,
        'eWallet' => null,
        'paymentAccountReference' => null
    ];

    public static function swaggerTypes()
    {
        return self::$swaggerTypes;
    }

    public static function swaggerFormats()
    {
        return self::$swaggerFormats;
    }

    /**
     * Array of attributes where the key is the local name, and the value is the original name
     * @var string[]
     */
    protected static $attributeMap = [
        'card' => 'card',
        'tokenizedCard' => 'tokenizedCard',
        'directDebit' => 'directDebit',
        'fluidData' => 'fluidData',
        'customer' => 'customer',
        'paymentInstrument' => 'paymentInstrument',
        'instrumentIdentifier' => 'instrumentIdentifier',
        'shippingAddress' => 'shippingAddress',
        'legacyToken' => 'legacyToken',
        'bank' => 'bank',
        'options' => 'options',
        'paymentType' => 'paymentType',
        'initiationChannel' => 'initiationChannel',
        'sepa' => 'sepa',
        'eWallet' => 'eWallet',
        'paymentAccountReference' => 'paymentAccountReference'
    ];


    /**
     * Array of attributes to setter functions (for deserialization of responses)
     * @var string[]
     */
    protected static $setters = [
        'card' => 'setCard',
        'tokenizedCard' => 'setTokenizedCard',
        'directDebit' => 'setDirectDebit',
        'fluidData' => 'setFluidData',
        'customer' => 'setCustomer',
        'paymentInstrument' => 'setPaymentInstrument',
        'instrumentIdentifier' => 'setInstrumentIdentifier',
        'shippingAddress' => 'setShippingAddress',
        'legacyToken' => 'setLegacyToken',
        'bank' => 'setBank',
        'options' => 'setOptions',
        'paymentType' => 'setPaymentType',
        'initiationChannel' => 'setInitiationChannel',
        'sepa' => 'setSepa',
        'eWallet' => 'setEWallet',
        'paymentAccountReference' => 'setPaymentAccountReference'
    ];


    /**
     * Array of attributes to getter functions (for serialization of requests)
     * @var string[]
     */
    protected static $getters = [
        'card' => 'getCard',
        'tokenizedCard' => 'getTokenizedCard',
        'directDebit' => 'getDirectDebit',
        'fluidData' => 'getFluidData',
        'customer' => 'getCustomer',
        'paymentInstrument' => 'getPaymentInstrument',
        'instrumentIdentifier' => 'getInstrumentIdentifier',
        'shippingAddress' => 'getShippingAddress',
        'legacyToken' => 'getLegacyToken',
        'bank' => 'getBank',
        'options' => 'getOptions',
        'paymentType' => 'getPaymentType',
        'initiationChannel' => 'getInitiationChannel',
        'sepa' => 'getSepa',
        'eWallet' => 'getEWallet',
        'paymentAccountReference' => 'getPaymentAccountReference'
    ];

    public static function attributeMap()
    {
        return self::$attributeMap;
    }

    public static function setters()
    {
        return self::$setters;
    }

    public static function getters()
    {
        return self::$getters;
    }

    

    

    /**
     * Associative array for storing property values
     * @var mixed[]
     */
    protected $container = [];

    /**
     * Constructor
     * @param mixed[] $data Associated array of property values initializing the model
     */
    public function __construct(array $data = null)
    {
        $this->container['card'] = isset($data['card']) ? $data['card'] : null;
        $this->container['tokenizedCard'] = isset($data['tokenizedCard']) ? $data['tokenizedCard'] : null;
        $this->container['directDebit'] = isset($data['directDebit']) ? $data['directDebit'] : null;
        $this->container['fluidData'] = isset($data['fluidData']) ? $data['fluidData'] : null;
        $this->container['customer'] = isset($data['customer']) ? $data['customer'] : null;
        $this->container['paymentInstrument'] = isset($data['paymentInstrument']) ? $data['paymentInstrument'] : null;
        $this->container['instrumentIdentifier'] = isset($data['instrumentIdentifier']) ? $data['instrumentIdentifier'] : null;
        $this->container['shippingAddress'] = isset($data['shippingAddress']) ? $data['shippingAddress'] : null;
        $this->container['legacyToken'] = isset($data['legacyToken']) ? $data['legacyToken'] : null;
        $this->container['bank'] = isset($data['bank']) ? $data['bank'] : null;
        $this->container['options'] = isset($data['options']) ? $data['options'] : null;
        $this->container['paymentType'] = isset($data['paymentType']) ? $data['paymentType'] : null;
        $this->container['initiationChannel'] = isset($data['initiationChannel']) ? $data['initiationChannel'] : null;
        $this->container['sepa'] = isset($data['sepa']) ? $data['sepa'] : null;
        $this->container['eWallet'] = isset($data['eWallet']) ? $data['eWallet'] : null;
        $this->container['paymentAccountReference'] = isset($data['paymentAccountReference']) ? $data['paymentAccountReference'] : null;
    }

    /**
     * show all the invalid properties with reasons.
     *
     * @return array invalid properties with reasons
     */
    public function listInvalidProperties()
    {
        $invalid_properties = [];

        return $invalid_properties;
    }

    /**
     * validate all the properties in the model
     * return true if all passed
     *
     * @return bool True if all properties are valid
     */
    public function valid()
    {

        return true;
    }


    /**
     * Gets card
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationCard
     */
    public function getCard()
    {
        return $this->container['card'];
    }

    /**
     * Sets card
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationCard $card
     * @return $this
     */
    public function setCard($card)
    {
        $this->container['card'] = $card;

        return $this;
    }

    /**
     * Gets tokenizedCard
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationTokenizedCard
     */
    public function getTokenizedCard()
    {
        return $this->container['tokenizedCard'];
    }

    /**
     * Sets tokenizedCard
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationTokenizedCard $tokenizedCard
     * @return $this
     */
    public function setTokenizedCard($tokenizedCard)
    {
        $this->container['tokenizedCard'] = $tokenizedCard;

        return $this;
    }

    /**
     * Gets directDebit
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationDirectDebit
     */
    public function getDirectDebit()
    {
        return $this->container['directDebit'];
    }

    /**
     * Sets directDebit
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationDirectDebit $directDebit
     * @return $this
     */
    public function setDirectDebit($directDebit)
    {
        $this->container['directDebit'] = $directDebit;

        return $this;
    }

    /**
     * Gets fluidData
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationFluidData
     */
    public function getFluidData()
    {
        return $this->container['fluidData'];
    }

    /**
     * Sets fluidData
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationFluidData $fluidData
     * @return $this
     */
    public function setFluidData($fluidData)
    {
        $this->container['fluidData'] = $fluidData;

        return $this;
    }

    /**
     * Gets customer
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationCustomer
     */
    public function getCustomer()
    {
        return $this->container['customer'];
    }

    /**
     * Sets customer
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationCustomer $customer
     * @return $this
     */
    public function setCustomer($customer)
    {
        $this->container['customer'] = $customer;

        return $this;
    }

    /**
     * Gets paymentInstrument
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationPaymentInstrument
     */
    public function getPaymentInstrument()
    {
        return $this->container['paymentInstrument'];
    }

    /**
     * Sets paymentInstrument
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationPaymentInstrument $paymentInstrument
     * @return $this
     */
    public function setPaymentInstrument($paymentInstrument)
    {
        $this->container['paymentInstrument'] = $paymentInstrument;

        return $this;
    }

    /**
     * Gets instrumentIdentifier
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationInstrumentIdentifier
     */
    public function getInstrumentIdentifier()
    {
        return $this->container['instrumentIdentifier'];
    }

    /**
     * Sets instrumentIdentifier
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationInstrumentIdentifier $instrumentIdentifier
     * @return $this
     */
    public function setInstrumentIdentifier($instrumentIdentifier)
    {
        $this->container['instrumentIdentifier'] = $instrumentIdentifier;

        return $this;
    }

    /**
     * Gets shippingAddress
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationShippingAddress
     */
    public function getShippingAddress()
    {
        return $this->container['shippingAddress'];
    }

    /**
     * Sets shippingAddress
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationShippingAddress $shippingAddress
     * @return $this
     */
    public function setShippingAddress($shippingAddress)
    {
        $this->container['shippingAddress'] = $shippingAddress;

        return $this;
    }

    /**
     * Gets legacyToken
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationLegacyToken
     */
    public function getLegacyToken()
    {
        return $this->container['legacyToken'];
    }

    /**
     * Sets legacyToken
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationLegacyToken $legacyToken
     * @return $this
     */
    public function setLegacyToken($legacyToken)
    {
        $this->container['legacyToken'] = $legacyToken;

        return $this;
    }

    /**
     * Gets bank
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationBank
     */
    public function getBank()
    {
        return $this->container['bank'];
    }

    /**
     * Sets bank
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationBank $bank
     * @return $this
     */
    public function setBank($bank)
    {
        $this->container['bank'] = $bank;

        return $this;
    }

    /**
     * Gets options
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationOptions
     */
    public function getOptions()
    {
        return $this->container['options'];
    }

    /**
     * Sets options
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationOptions $options
     * @return $this
     */
    public function setOptions($options)
    {
        $this->container['options'] = $options;

        return $this;
    }

    /**
     * Gets paymentType
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationPaymentType
     */
    public function getPaymentType()
    {
        return $this->container['paymentType'];
    }

    /**
     * Sets paymentType
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationPaymentType $paymentType
     * @return $this
     */
    public function setPaymentType($paymentType)
    {
        $this->container['paymentType'] = $paymentType;

        return $this;
    }

    /**
     * Gets initiationChannel
     * @return string
     */
    public function getInitiationChannel()
    {
        return $this->container['initiationChannel'];
    }

    /**
     * Sets initiationChannel
     * @param string $initiationChannel Mastercard-defined code that indicates how the account information was obtained.  - `00`: Card - `01`: Mobile Network Operator (MNO) controlled removable secure element (SIM or UICC) personalized for use with a mobile phone or smartphone - `02`: Key fob - `03`: Watch using a contactless chip or a fixed (non-removable) secure element not controlled by the MNO - `04`: Mobile tag - `05`: Wristband - `06`: Mobile phone case or sleeve - `07`: Mobile phone or smartphone with a fixed (non-removable) secure element controlled by the MNO,for example, code division multiple access (CDMA) - `08`: Removable secure element not controlled by the MNO, for example, memory card personalized forused with a mobile phone or smartphone - `09`: Mobile Phone or smartphone with a fixed (non-removable) secure element not controlled by the MNO - `10`: MNO controlled removable secure element (SIM or UICC) personalized for use with a tablet or e-book - `11`: Tablet or e-book with a fixed (non-removable) secure element controlled by the MNO - `12`: Removable secure element not controlled by the MNO, for example, memory card personalized foruse with a tablet or e-book - `13`: Tablet or e-book with fixed (non-removable) secure element not controlled by the MNO - `14`: Mobile phone or smartphone with a payment application running in a host processor - `15`: Tablet or e-book with a payment application running in a host processor - `16`: Mobile phone or smartphone with a payment application running in the Trusted ExecutionEnvironment (TEE) of a host processor - `17`: Tablet or e-book with a payment application running in the TEE of a host processor - `18`: Watch with a payment application running in the TEE of a host processor - `19`: Watch with a payment application running in a host processor  Values from 20–99 exclusively indicate the form factor only without also indicating the storage technology  - `20`: Card - `21`: Phone e.g. Mobile Phone - `22`: Tablet/e-reader - `23`: Watch/Wristband e.g. Watch or wristband, including a fitness band, smart strap, disposable band, watch add-on, and security/ID band - `24`: Sticker - `25`: PC - `26`: Device Peripheral e.g. mobile phone case or sleeve - `27`: Tag e.g. key fob or mobile tag - `28`: Jewelry e.g. ring, bracelet, necklace and cuff links - `29`: Fashion Accessory e.g. handbag, bag charm and glasses - `30`: Garment e.g. dress - `31`: Domestic Appliance e.g refrigerator, washing machine - `32`: Vehicle e.g. vehicle, including vehicle attached devices - `33`: Media/Gaming Device e.g. media or gaming device, including a set top box, media player and television  34–99 are reserved for future form factors. Any value in this range may occur within form factor and transaction data without prior notice.  This field is supported only for Mastercard on CyberSource through VisaNet. When initiation channel is not provided via this API field, the value is extracted from EMV tag 9F6E for Mastercard transactions. To enable this feature please call support.  #### Used by **Authorization** Optional field.
     * @return $this
     */
    public function setInitiationChannel($initiationChannel)
    {
        $this->container['initiationChannel'] = $initiationChannel;

        return $this;
    }

    /**
     * Gets sepa
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationSepa
     */
    public function getSepa()
    {
        return $this->container['sepa'];
    }

    /**
     * Sets sepa
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationSepa $sepa
     * @return $this
     */
    public function setSepa($sepa)
    {
        $this->container['sepa'] = $sepa;

        return $this;
    }

    /**
     * Gets eWallet
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationEWallet
     */
    public function getEWallet()
    {
        return $this->container['eWallet'];
    }

    /**
     * Sets eWallet
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationEWallet $eWallet
     * @return $this
     */
    public function setEWallet($eWallet)
    {
        $this->container['eWallet'] = $eWallet;

        return $this;
    }

    /**
     * Gets paymentAccountReference
     * @return \CyberSource\Model\Ptsv2paymentsPaymentInformationPaymentAccountReference
     */
    public function getPaymentAccountReference()
    {
        return $this->container['paymentAccountReference'];
    }

    /**
     * Sets paymentAccountReference
     * @param \CyberSource\Model\Ptsv2paymentsPaymentInformationPaymentAccountReference $paymentAccountReference
     * @return $this
     */
    public function setPaymentAccountReference($paymentAccountReference)
    {
        $this->container['paymentAccountReference'] = $paymentAccountReference;

        return $this;
    }
    /**
     * Returns true if offset exists. False otherwise.
     * @param  integer $offset Offset
     * @return boolean
     */
    #[\ReturnTypeWillChange]
    public function offsetExists($offset)
    {
        return isset($this->container[$offset]);
    }

    /**
     * Gets offset.
     * @param  integer $offset Offset
     * @return mixed
     */
    #[\ReturnTypeWillChange]
    public function offsetGet($offset)
    {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }

    /**
     * Sets value based on offset.
     * @param  integer $offset Offset
     * @param  mixed   $value  Value to be set
     * @return void
     */
    #[\ReturnTypeWillChange]
    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }

    /**
     * Unsets offset.
     * @param  integer $offset Offset
     * @return void
     */
    #[\ReturnTypeWillChange]
    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }

    /**
     * Gets the string presentation of the object
     * @return string
     */
    public function __toString()
    {
        if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print
            return json_encode(\CyberSource\ObjectSerializer::sanitizeForSerialization($this), JSON_PRETTY_PRINT);
        }

        return json_encode(\CyberSource\ObjectSerializer::sanitizeForSerialization($this));
    }
}


