<?php
/**
 * @brief		Package Listener
 * @author		<a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
 * @copyright	(c) Invision Power Services, Inc.
 * @license		https://www.invisioncommunity.com/legal/standards/
 * @package		Invision Community
{subpackage}
 * @since		{date}
 */

namespace IPS\{app}\listeners;

/* To prevent PHP errors (extending class does not exist) revealing path */

use IPS\Events\ListenerType\PackageListenerType;
use IPS\Member as MemberClass;
use IPS\nexus\Invoice as InvoiceClass;
use IPS\nexus\Invoice\Item as InvoiceItem;
use IPS\nexus\Package as PackageClass;
use IPS\nexus\Purchase as PurchaseClass;
use IPS\nexus\Purchase\RenewalTerm;
use function defined;

if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header(($_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0') . ' 403 Forbidden');
	exit;
}

/**
 * Package Listener
 */
class {filename} extends PackageListenerType
{
	/**
	 * @brief	[Required] The class that is handled by this listener
	 * @var string
	 */
	public static string $class = {class};

	/**
	 * On Purchase Canceled
	 *
	 * @param InvoiceItem $item
	 * @param PurchaseClass $purchase	The purchase
	 * @return	void
	 */
	public function onCancel( InvoiceItem $item, PurchaseClass $purchase ) : void
	{

	}

	/**
	 * On Upgrade/Downgrade
	 *
	 * @param InvoiceItem $item
	 * @param PurchaseClass $purchase The purchase
	 * @param PackageClass $newPackage The package to upgrade to
	 * @param int|RenewalTerm|NULL $chosenRenewalOption The chosen renewal option
	 * @return    void
	 */
	public function onChange( InvoiceItem $item, PurchaseClass $purchase, PackageClass $newPackage, int|RenewalTerm $chosenRenewalOption = NULL ) : void
	{

	}

	/**
	 * On Purchase Deleted
	 *
	 * @param InvoiceItem $item
	 * @param PurchaseClass $purchase	The purchase
	 * @return	void
	 */
	public function onDelete( InvoiceItem $item, PurchaseClass $purchase ) : void
	{

	}

	/**
	 * On expire soon
	 * If returns TRUE, the normal expire warning email will not be sent
	 *
	 * @param InvoiceItem $item
	 * @param PurchaseClass $purchase	The purchase
	 * @return	void
	 */
	public function onExpireWarning( InvoiceItem $item, PurchaseClass $purchase ) : void
	{

	}

	/**
	 * On Purchase Expired
	 *
	 * @param InvoiceItem $item
	 * @param PurchaseClass $purchase	The purchase
	 * @return	void
	 */
	public function onExpire( InvoiceItem $item, PurchaseClass $purchase ) : void
	{

	}

	/**
	 * On Invoice Cancel (when unpaid)
	 *
	 * @param InvoiceItem $item
	 * @param InvoiceClass $invoice	The invoice
	 * @return	void
	 */
	public function onInvoiceCancel( InvoiceItem $item, InvoiceClass $invoice ) : void
	{

	}

	/**
	 * On Paid
	 *
	 * @param InvoiceItem $item
	 * @param InvoiceClass $invoice	The invoice
	 * @return	void
	 */
	public function onPaid( InvoiceItem $item, InvoiceClass $invoice ) : void
	{

	}

	/**
	 * On Purchase Generated
	 *
	 * @param InvoiceItem $item
	 * @param PurchaseClass $purchase	The purchase
	 * @param InvoiceClass $invoice	The invoice
	 * @return	void
	 */
	public function onPurchaseGenerated( InvoiceItem $item, PurchaseClass $purchase, InvoiceClass $invoice ) : void
	{

	}

	/**
	 * On Purchase Reactivated (renewed after being expired or reactivated after being canceled)
	 *
	 * @param InvoiceItem $item
	 * @param PurchaseClass $purchase	The purchase
	 * @return	void
	 */
	public function onReactivate( InvoiceItem $item, PurchaseClass $purchase ) : void
	{

	}

	/**
	 * On Renew (Renewal invoice paid. Is not called if expiry data is manually changed)
	 *
	 * @param InvoiceItem $item
	 * @param PurchaseClass $purchase	The purchase
	 * @param	int					$cycles		Cycles
	 * @return	void
	 */
	public function onRenew( InvoiceItem $item, PurchaseClass $purchase, int $cycles ) : void
	{

	}

	/**
	 * On Transfer (is run before transferring)
	 *
	 * @param InvoiceItem $item
	 * @param PurchaseClass $purchase		The purchase
	 * @param	MemberClass			$newCustomer	New Customer
	 * @return	void
	 */
	public function onTransfer( InvoiceItem $item, PurchaseClass $purchase, MemberClass $newCustomer ) : void
	{

	}

	/**
	 * On Unpaid
	 *
	 * @param InvoiceItem $item
	 * @param InvoiceClass $invoice	The invoice
	 * @param	string				$status		Status
	 * @return	void
	 */
	public function onUnpaid( InvoiceItem $item, InvoiceClass $invoice, string $status ) : void
	{

	}
}