<?php

namespace PayPal\Api;

use PayPal\Common\PayPalModel;
use PayPal\Validation\UrlValidator;

/**
 * Class CartBase
 *
 * Base properties of a cart resource
 *
 * @package PayPal\Api
 *
 * @property string reference_id
 * @property \PayPal\Api\Amount amount
 * @property \PayPal\Api\Payee payee
 * @property string description
 * @property string note_to_payee
 * @property string custom
 * @property string invoice_number
 * @property string purchase_order
 * @property string soft_descriptor
 * @property \PayPal\Api\PaymentOptions payment_options
 * @property \PayPal\Api\ItemList item_list
 * @property string notify_url
 * @property string order_url
 */
class CartBase extends PayPalModel {

	/**
	 * Merchant identifier to the purchase unit. Optional parameter
	 *
	 * @param string $reference_id
	 * 
	 * @return $this
	 */
	public function setReferenceId( $reference_id) {
		$this->reference_id = $reference_id;
		return $this;
	}

	/**
	 * Merchant identifier to the purchase unit. Optional parameter
	 *
	 * @return string
	 */
	public function getReferenceId() {
		return $this->reference_id;
	}

	/**
	 * Amount being collected.
	 *
	 * @param \PayPal\Api\Amount $amount
	 * 
	 * @return $this
	 */
	public function setAmount( $amount) {
		$this->amount = $amount;
		return $this;
	}

	/**
	 * Amount being collected.
	 *
	 * @return \PayPal\Api\Amount
	 */
	public function getAmount() {
		return $this->amount;
	}

	/**
	 * Recipient of the funds in this transaction.
	 *
	 * @param \PayPal\Api\Payee $payee
	 * 
	 * @return $this
	 */
	public function setPayee( $payee) {
		$this->payee = $payee;
		return $this;
	}

	/**
	 * Recipient of the funds in this transaction.
	 *
	 * @return \PayPal\Api\Payee
	 */
	public function getPayee() {
		return $this->payee;
	}

	/**
	 * Description of what is being paid for.
	 *
	 * @param string $description
	 * 
	 * @return $this
	 */
	public function setDescription( $description) {
		$this->description = $description;
		return $this;
	}

	/**
	 * Description of what is being paid for.
	 *
	 * @return string
	 */
	public function getDescription() {
		return $this->description;
	}

	/**
	 * Note to the recipient of the funds in this transaction.
	 *
	 * @param string $note_to_payee
	 * 
	 * @return $this
	 */
	public function setNoteToPayee( $note_to_payee) {
		$this->note_to_payee = $note_to_payee;
		return $this;
	}

	/**
	 * Note to the recipient of the funds in this transaction.
	 *
	 * @return string
	 */
	public function getNoteToPayee() {
		return $this->note_to_payee;
	}

	/**
	 * free-form field for the use of clients
	 *
	 * @param string $custom
	 * 
	 * @return $this
	 */
	public function setCustom( $custom) {
		$this->custom = $custom;
		return $this;
	}

	/**
	 * free-form field for the use of clients
	 *
	 * @return string
	 */
	public function getCustom() {
		return $this->custom;
	}

	/**
	 * invoice number to track this payment
	 *
	 * @param string $invoice_number
	 * 
	 * @return $this
	 */
	public function setInvoiceNumber( $invoice_number) {
		$this->invoice_number = $invoice_number;
		return $this;
	}

	/**
	 * invoice number to track this payment
	 *
	 * @return string
	 */
	public function getInvoiceNumber() {
		return $this->invoice_number;
	}

	/**
	 * purchase order is number or id specific to this payment
	 *
	 * @param string $purchase_order
	 * 
	 * @return $this
	 */
	public function setPurchaseOrder( $purchase_order) {
		$this->purchase_order = $purchase_order;
		return $this;
	}

	/**
	 * purchase order is number or id specific to this payment
	 *
	 * @return string
	 */
	public function getPurchaseOrder() {
		return $this->purchase_order;
	}

	/**
	 * Soft descriptor used when charging this funding source. If length exceeds max length, the value will be truncated
	 *
	 * @param string $soft_descriptor
	 * 
	 * @return $this
	 */
	public function setSoftDescriptor( $soft_descriptor) {
		$this->soft_descriptor = $soft_descriptor;
		return $this;
	}

	/**
	 * Soft descriptor used when charging this funding source. If length exceeds max length, the value will be truncated
	 *
	 * @return string
	 */
	public function getSoftDescriptor() {
		return $this->soft_descriptor;
	}

	/**
	 * Soft descriptor city used when charging this funding source. If length exceeds max length, the value will be truncated. Only supported when the `payment_method` is set to `credit_card`
	 *
	 * @deprecated Not publicly available
	 * @param string $soft_descriptor_city
	 * 
	 * @return $this
	 */
	public function setSoftDescriptorCity( $soft_descriptor_city) {
		$this->soft_descriptor_city = $soft_descriptor_city;
		return $this;
	}

	/**
	 * Soft descriptor city used when charging this funding source. If length exceeds max length, the value will be truncated. Only supported when the `payment_method` is set to `credit_card`
	 *
	 * @deprecated Not publicly available
	 * @return string
	 */
	public function getSoftDescriptorCity() {
		return $this->soft_descriptor_city;
	}

	/**
	 * Payment options requested for this purchase unit
	 *
	 * @param \PayPal\Api\PaymentOptions $payment_options
	 * 
	 * @return $this
	 */
	public function setPaymentOptions( $payment_options) {
		$this->payment_options = $payment_options;
		return $this;
	}

	/**
	 * Payment options requested for this purchase unit
	 *
	 * @return \PayPal\Api\PaymentOptions
	 */
	public function getPaymentOptions() {
		return $this->payment_options;
	}

	/**
	 * List of items being paid for.
	 *
	 * @param \PayPal\Api\ItemList $item_list
	 * 
	 * @return $this
	 */
	public function setItemList( $item_list) {
		$this->item_list = $item_list;
		return $this;
	}

	/**
	 * List of items being paid for.
	 *
	 * @return \PayPal\Api\ItemList
	 */
	public function getItemList() {
		return $this->item_list;
	}

	/**
	 * URL to send payment notifications
	 *
	 * @param string $notify_url
	 * @throws \InvalidArgumentException
	 * @return $this
	 */
	public function setNotifyUrl( $notify_url) {
		UrlValidator::validate($notify_url, 'NotifyUrl');
		$this->notify_url = $notify_url;
		return $this;
	}

	/**
	 * URL to send payment notifications
	 *
	 * @return string
	 */
	public function getNotifyUrl() {
		return $this->notify_url;
	}

	/**
	 * Url on merchant site pertaining to this payment.
	 *
	 * @param string $order_url
	 * @throws \InvalidArgumentException
	 * @return $this
	 */
	public function setOrderUrl( $order_url) {
		UrlValidator::validate($order_url, 'OrderUrl');
		$this->order_url = $order_url;
		return $this;
	}

	/**
	 * Url on merchant site pertaining to this payment.
	 *
	 * @return string
	 */
	public function getOrderUrl() {
		return $this->order_url;
	}

	/**
	 * List of external funding being applied to the purchase unit. Each external_funding unit should have a unique reference_id
	 *
	 * @deprecated Not publicly available
	 * @param \PayPal\Api\ExternalFunding[] $external_funding
	 *
	 * @return $this
	 */
	public function setExternalFunding( $external_funding) {
		$this->external_funding = $external_funding;
		return $this;
	}

	/**
	 * List of external funding being applied to the purchase unit. Each external_funding unit should have a unique reference_id
	 *
	 * @deprecated Not publicly available
	 * @return \PayPal\Api\ExternalFunding[]
	 */
	public function getExternalFunding() {
		return $this->external_funding;
	}

	/**
	 * Append ExternalFunding to the list.
	 *
	 * @deprecated Not publicly available
	 * @param \PayPal\Api\ExternalFunding $externalFunding
	 * @return $this
	 */
	public function addExternalFunding( $externalFunding) {
		if (!$this->getExternalFunding()) {
			return $this->setExternalFunding(array($externalFunding));
		} else {
			return $this->setExternalFunding(
				array_merge($this->getExternalFunding(), array($externalFunding))
			);
		}
	}

	/**
	 * Remove ExternalFunding from the list.
	 *
	 * @deprecated Not publicly available
	 * @param \PayPal\Api\ExternalFunding $externalFunding
	 * @return $this
	 */
	public function removeExternalFunding( $externalFunding) {
		return $this->setExternalFunding(
			array_diff($this->getExternalFunding(), array($externalFunding))
		);
	}

}
