<?php

namespace PayPal\Api;

use PayPal\Common\PayPalModel;

/**
 * Class PaymentDefinition
 *
 * Resource representing payment definition scheduling information.
 *
 * @package PayPal\Api
 *
 * @property string id
 * @property string name
 * @property string type
 * @property string frequency_interval
 * @property string frequency
 * @property string cycles
 * @property \PayPal\Api\Currency amount
 * @property \PayPal\Api\ChargeModel[] charge_models
 */
class PaymentDefinition extends PayPalModel {

	/**
	 * Identifier of the payment_definition. 128 characters max.
	 *
	 * @param string $id
	 * 
	 * @return $this
	 */
	public function setId( $id) {
		$this->id = $id;
		return $this;
	}

	/**
	 * Identifier of the payment_definition. 128 characters max.
	 *
	 * @return string
	 */
	public function getId() {
		return $this->id;
	}

	/**
	 * Name of the payment definition. 128 characters max.
	 *
	 * @param string $name
	 * 
	 * @return $this
	 */
	public function setName( $name) {
		$this->name = $name;
		return $this;
	}

	/**
	 * Name of the payment definition. 128 characters max.
	 *
	 * @return string
	 */
	public function getName() {
		return $this->name;
	}

	/**
	 * Type of the payment definition. Allowed values: `TRIAL`, `REGULAR`.
	 *
	 * @param string $type
	 * 
	 * @return $this
	 */
	public function setType( $type) {
		$this->type = $type;
		return $this;
	}

	/**
	 * Type of the payment definition. Allowed values: `TRIAL`, `REGULAR`.
	 *
	 * @return string
	 */
	public function getType() {
		return $this->type;
	}

	/**
	 * How frequently the customer should be charged.
	 *
	 * @param string $frequency_interval
	 * 
	 * @return $this
	 */
	public function setFrequencyInterval( $frequency_interval) {
		$this->frequency_interval = $frequency_interval;
		return $this;
	}

	/**
	 * How frequently the customer should be charged.
	 *
	 * @return string
	 */
	public function getFrequencyInterval() {
		return $this->frequency_interval;
	}

	/**
	 * Frequency of the payment definition offered. Allowed values: `WEEK`, `DAY`, `YEAR`, `MONTH`.
	 *
	 * @param string $frequency
	 * 
	 * @return $this
	 */
	public function setFrequency( $frequency) {
		$this->frequency = $frequency;
		return $this;
	}

	/**
	 * Frequency of the payment definition offered. Allowed values: `WEEK`, `DAY`, `YEAR`, `MONTH`.
	 *
	 * @return string
	 */
	public function getFrequency() {
		return $this->frequency;
	}

	/**
	 * Number of cycles in this payment definition.
	 *
	 * @param string $cycles
	 * 
	 * @return $this
	 */
	public function setCycles( $cycles) {
		$this->cycles = $cycles;
		return $this;
	}

	/**
	 * Number of cycles in this payment definition.
	 *
	 * @return string
	 */
	public function getCycles() {
		return $this->cycles;
	}

	/**
	 * Amount that will be charged at the end of each cycle for this payment definition.
	 *
	 * @param \PayPal\Api\Currency $amount
	 * 
	 * @return $this
	 */
	public function setAmount( $amount) {
		$this->amount = $amount;
		return $this;
	}

	/**
	 * Amount that will be charged at the end of each cycle for this payment definition.
	 *
	 * @return \PayPal\Api\Currency
	 */
	public function getAmount() {
		return $this->amount;
	}

	/**
	 * Array of charge_models for this payment definition.
	 *
	 * @param \PayPal\Api\ChargeModel[] $charge_models
	 * 
	 * @return $this
	 */
	public function setChargeModels( $charge_models) {
		$this->charge_models = $charge_models;
		return $this;
	}

	/**
	 * Array of charge_models for this payment definition.
	 *
	 * @return \PayPal\Api\ChargeModel[]
	 */
	public function getChargeModels() {
		return $this->charge_models;
	}

	/**
	 * Append ChargeModels to the list.
	 *
	 * @param \PayPal\Api\ChargeModel $chargeModel
	 * @return $this
	 */
	public function addChargeModel( $chargeModel) {
		if (!$this->getChargeModels()) {
			return $this->setChargeModels(array($chargeModel));
		} else {
			return $this->setChargeModels(
				array_merge($this->getChargeModels(), array($chargeModel))
			);
		}
	}

	/**
	 * Remove ChargeModels from the list.
	 *
	 * @param \PayPal\Api\ChargeModel $chargeModel
	 * @return $this
	 */
	public function removeChargeModel( $chargeModel) {
		return $this->setChargeModels(
			array_diff($this->getChargeModels(), array($chargeModel))
		);
	}

}
