<?php

namespace Aws\Api;

use DateTime;
use InvalidArgumentException;
use UnexpectedValueException;

/**
 * Represents a timestamp shape.
 */
class TimestampShape extends Shape {
	public function __construct( array $definition, ShapeMap $shapeMap ) {
		$definition['type'] = 'timestamp';
		parent::__construct( $definition, $shapeMap );
	}

	/**
	 * Formats a timestamp value for a service.
	 *
	 * @param mixed $value Value to format
	 * @param string $format Format used to serialize the value
	 *
	 * @return int|string
	 * @throws UnexpectedValueException if the format is unknown.
	 * @throws InvalidArgumentException if the value is an unsupported type.
	 */
	public static function format( $value, $format ) {
		if ( $value instanceof DateTime ) {
			$value = $value->getTimestamp();
		} elseif ( is_string( $value ) ) {
			$value = strtotime( $value );
		} elseif ( ! is_int( $value ) ) {
			throw new InvalidArgumentException( 'Unable to handle the provided'
			                                     . ' timestamp type: ' . gettype( $value ) );
		}

		switch ( $format ) {
			case 'iso8601':
				return gmdate( 'Y-m-d\TH:i:s\Z', $value );
			case 'rfc822':
				return gmdate( 'D, d M Y H:i:s \G\M\T', $value );
			case 'unixTimestamp':
				return $value;
			default:
				throw new UnexpectedValueException( 'Unknown timestamp format: '
				                                     . $format );
		}
	}
}
