<?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;
    }

}
