<?php
/**
 * @brief		Shipping method input class for Form Builder
 * @subpackage	Nexus
 * @since		19 Mar 2014
 */

namespace IPS\nexus\Form;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * Shipping method input class for Form Builder
 */
class _Shipping extends \IPS\Helpers\Form\FormAbstract
{
	/**
	 * @brief	Default Options
	 * @code
	 	$defaultOptions = array(
	 		'options'	=> array(			// Options
	 			'set1'		=> array(			// Group items into sets with similar methods
	 				'items'		=> array(			// Array of item data
	 					'itemName'		=> '',				// Name
	 				),
	 				'methods'	=> array(			// Array of methods (classes which implement \IPS\nexus\Shipping\Rate)
	 					\IPS\nexus\Shipping\Rate,
	 					...
	 				)
	 			),
	 			'set2'		=> array(...),	// Repeat for however many sets you like
	 		),
	 		'currency'	=> 'USD',			// Currency to display prices in
	 		'invoice'	=> \IPS\nexus\Invoice::load(1),	// Invoice (some shipping methods may use it for determining price)
	 	);
	 * @endcode
	 */
	protected $defaultOptions = array(
		'options'	=> NULL,
		'currency'	=> NULL,
		'invoice'	=> NULL,
	);

	/** 
	 * Get HTML
	 *
	 * @return	string
	 */
	public function html()
	{
		return \IPS\Theme::i()->getTemplate( 'forms', 'nexus', 'global' )->shipping( $this->name, $this->value, $this->options );
	}
		
	/**
	 * Validate
	 *
	 * @throws	\InvalidArgumentException
	 * @return	TRUE
	 */
	public function validate()
	{
		foreach ( $this->options['options'] as $group => $options )
		{
			if ( !isset( $this->value[ $group ] ) or !$this->value[ $group ] )
			{
				if ( $this->required )
				{
					throw new \InvalidArgumentException('form_required');
				}
			}
			elseif ( !\in_array( $this->value[ $group ], array_keys( $options['methods'] ) ) )
			{
				throw new \OutOfRangeException( 'form_bad_value' );
			}
		}
		
		return parent::validate();
	}
}