<?php
namespace W3TC;

/**
 * W3 CDN Netdna Class
 */

if ( !defined( 'W3TC_CDN_EDGECAST_PURGE_URL' ) ) define( 'W3TC_CDN_EDGECAST_PURGE_URL', 'http://api.edgecast.com/v2/mcc/customers/%s/edge/purge' );
define( 'W3TC_CDN_EDGECAST_MEDIATYPE_WINDOWS_MEDIA_STREAMING', 1 );
define( 'W3TC_CDN_EDGECAST_MEDIATYPE_FLASH_MEDIA_STREAMING', 2 );
define( 'W3TC_CDN_EDGECAST_MEDIATYPE_HTTP_LARGE_OBJECT', 3 );
define( 'W3TC_CDN_EDGECAST_MEDIATYPE_HTTP_SMALL_OBJECT', 8 );
define( 'W3TC_CDN_EDGECAST_MEDIATYPE_APPLICATION_DELIVERY_NETWORK', 14 );

/**
 * class CdnEngine_Mirror_Edgecast
 */
class CdnEngine_Mirror_Edgecast extends CdnEngine_Mirror {
	/**
	 * PHP5 Constructor
	 *
	 * @param array   $config
	 */
	function __construct( $config = array() ) {
		$config = array_merge( array(
				'apiid' => '',
				'apikey' => ''
			), $config );

		parent::__construct( $config );
	}

	/**
	 * Purges remote files
	 *
	 * @param array   $files
	 * @param array   $results
	 * @return boolean
	 */
	function purge( $files, &$results ) {
		if ( empty( $this->_config['account'] ) ) {
			$results = $this->_get_results( $files, W3TC_CDN_RESULT_HALT, __( 'Empty account #.', 'w3-total-cache' ) );

			return false;
		}

		if ( empty( $this->_config['token'] ) ) {
			$results = $this->_get_results( $files, W3TC_CDN_RESULT_HALT, __( 'Empty token.', 'w3-total-cache' ) );

			return false;
		}

		foreach ( $files as $file ) {
			$local_path = $file['local_path'];
			$remote_path = $file['remote_path'];

			$url = $this->format_url( $remote_path );

			$error = null;

			if ( $this->_purge_content( $url, W3TC_CDN_EDGECAST_MEDIATYPE_HTTP_SMALL_OBJECT, $error ) ) {
				$results[] = $this->_get_result( $local_path, $remote_path,
					W3TC_CDN_RESULT_OK, __( 'OK', 'w3-total-cache' ), $file );
			} else {
				$results[] = $this->_get_result( $local_path, $remote_path,
					W3TC_CDN_RESULT_ERROR,
					sprintf( __( 'Unable to purge (%s).', 'w3-total-cache' ), $error ),
					$file );
			}
		}

		return !$this->_is_error( $results );
	}

	/**
	 * Purges CDN completely
	 *
	 * @param unknown $results
	 * @return bool
	 */
	function purge_all( &$results ) {
		return $this->purge( array( array( 'local_path'=>'*', 'remote_path'=> '*' ) ), $results );
	}

	/**
	 * Purge content
	 *
	 * @param string  $path
	 * @param int     $type
	 * @param string  $error
	 * @return boolean
	 */
	function _purge_content( $path, $type, &$error ) {
		$url = sprintf( W3TC_CDN_EDGECAST_PURGE_URL, $this->_config['account'] );
		$args = array(
			'method' => 'PUT',
			'user-agent' => W3TC_POWERED_BY,
			'headers' => array(
				'Accept' => 'application/json',
				'Content-Type' => 'application/json',
				'Authorization' => sprintf( 'TOK:%s', $this->_config['token'] )
			),
			'body' => json_encode( array(
					'MediaPath' => $path,
					'MediaType' => $type
				) )
		);

		$response = wp_remote_request( $url, $args );

		if ( is_wp_error( $response ) ) {
			$error = implode( '; ', $response->get_error_messages() );

			return false;
		}

		switch ( $response['response']['code'] ) {
		case 200:
			return true;

		case 400:
			$error = __( 'Invalid Request Parameter', 'w3-total-cache' );
			return false;

		case 403:
			$error = __( 'Authentication Failure or Insufficient Access Rights', 'w3-total-cache' );
			return false;

		case 404:
			$error = __( 'Invalid Request URI', 'w3-total-cache' );
			return false;

		case 405:
			$error = __( 'Invalid Request', 'w3-total-cache' );
			return false;

		case 500:
			$error = __( 'Server Error', 'w3-total-cache' );
			return false;
		}

		$error = 'Unknown error';

		return false;
	}
}
