<?php

namespace Aws\Api\ErrorParser;

use Aws\Api\Parser\JsonParser;
use Aws\Api\Service;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;

/**
 * Parses JSON-REST errors.
 */
class RestJsonErrorParser extends AbstractErrorParser {
	use JsonParserTrait;

	private $parser;

	public function __construct( Service $api = null, JsonParser $parser = null ) {
		parent::__construct( $api );
		$this->parser = $parser ?: new JsonParser();
	}

	public function __invoke(
		ResponseInterface $response,
		CommandInterface $command = null
	) {
		$data = $this->genericHandler( $response );

		// Merge in error data from the JSON body
		if ( $json = $data['parsed'] ) {
			$data = array_replace( $data, $json );
		}

		// Correct error type from services like Amazon Glacier
		if ( ! empty( $data['type'] ) ) {
			$data['type'] = strtolower( $data['type'] );
		}

		// Retrieve the error code from services like Amazon Elastic Transcoder
		if ( $code = $response->getHeaderLine( 'x-amzn-errortype' ) ) {
			$colon        = strpos( $code, ':' );
			$data['code'] = $colon ? substr( $code, 0, $colon ) : $code;
		}

		// Retrieve error message directly
		$data['message'] = isset( $data['parsed']['message'] )
			? $data['parsed']['message']
			: ( isset( $data['parsed']['Message'] )
				? $data['parsed']['Message']
				: null );

		$this->populateShape( $data, $response, $command );

		return $data;
	}
}
