<?php



namespace PayPal\Api;



use PayPal\Common\PayPalResourceModel;

use PayPal\Rest\ApiContext;

use PayPal\Validation\ArgumentValidator;



/**

 * Class PaymentInstruction

 *

 * Contain details of how and when the payment should be made to PayPal in cases of manual bank transfer.

 *

 * @package PayPal\Api

 *

 * @property string                                  reference_number

 * @property string                                  instruction_type

 * @property \PayPal\Api\RecipientBankingInstruction recipient_banking_instruction

 * @property \PayPal\Api\Currency                    amount

 * @property string                                  payment_due_date

 * @property string                                  note

 * @property \PayPal\Api\Links[]                     links

 */

class PaymentInstruction extends PayPalResourceModel

{

    /**

     * ID of payment instruction

     *

     * @param string $reference_number

     *

     * @return $this

     */

    public function setReferenceNumber($reference_number)

    {

        $this->reference_number = $reference_number;

        return $this;

    }



    /**

     * ID of payment instruction

     *

     * @return string

     */

    public function getReferenceNumber()

    {

        return $this->reference_number;

    }



    /**

     * Type of payment instruction

     * Valid Values: ["MANUAL_BANK_TRANSFER", "PAY_UPON_INVOICE"]

     *

     * @param string $instruction_type

     *

     * @return $this

     */

    public function setInstructionType($instruction_type)

    {

        $this->instruction_type = $instruction_type;

        return $this;

    }



    /**

     * Type of payment instruction

     *

     * @return string

     */

    public function getInstructionType()

    {

        return $this->instruction_type;

    }



    /**

     * Recipient bank Details.

     *

     * @param \PayPal\Api\RecipientBankingInstruction $recipient_banking_instruction

     *

     * @return $this

     */

    public function setRecipientBankingInstruction($recipient_banking_instruction)

    {

        $this->recipient_banking_instruction = $recipient_banking_instruction;

        return $this;

    }



    /**

     * Recipient bank Details.

     *

     * @return \PayPal\Api\RecipientBankingInstruction

     */

    public function getRecipientBankingInstruction()

    {

        return $this->recipient_banking_instruction;

    }



    /**

     * Amount to be transferred

     *

     * @param \PayPal\Api\Currency $amount

     *

     * @return $this

     */

    public function setAmount($amount)

    {

        $this->amount = $amount;

        return $this;

    }



    /**

     * Amount to be transferred

     *

     * @return \PayPal\Api\Currency

     */

    public function getAmount()

    {

        return $this->amount;

    }



    /**

     * Date by which payment should be received

     *

     * @param string $payment_due_date

     *

     * @return $this

     */

    public function setPaymentDueDate($payment_due_date)

    {

        $this->payment_due_date = $payment_due_date;

        return $this;

    }



    /**

     * Date by which payment should be received

     *

     * @return string

     */

    public function getPaymentDueDate()

    {

        return $this->payment_due_date;

    }



    /**

     * Additional text regarding payment handling

     *

     * @param string $note

     *

     * @return $this

     */

    public function setNote($note)

    {

        $this->note = $note;

        return $this;

    }



    /**

     * Additional text regarding payment handling

     *

     * @return string

     */

    public function getNote()

    {

        return $this->note;

    }



    /**

     * Retrieve a payment instruction by passing the payment_id in the request URI. Use this request if you are implementing a solution that includes delayed payment like Pay Upon Invoice (PUI).

     *

     * @param string         $paymentId

     * @param ApiContext     $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.

     * @param PayPalRestCall $restCall   is the Rest Call Service that is used to make rest calls

     * @return PaymentInstruction

     */

    public static function get($paymentId, $apiContext = null, $restCall = null)

    {

        ArgumentValidator::validate($paymentId, 'paymentId');

        $payLoad = "";

        $json = self::executeCall(

            "/v1/payments/payment/$paymentId/payment-instruction",

            "GET",

            $payLoad,

            null,

            $apiContext,

            $restCall

        );

        $ret = new PaymentInstruction();

        $ret->fromJson($json);

        return $ret;

    }



}

