<?php

namespace Aws\S3;

use Aws\Api\Parser\AbstractParser;
use Aws\Api\StructureShape;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;

/**
 * @internal Decorates a parser for the S3 service to correctly handle the
 *           GetBucketLocation operation.
 */
class GetBucketLocationParser extends AbstractParser {
	/**
	 * @param callable $parser Parser to wrap.
	 */
	public function __construct( callable $parser ) {
		$this->parser = $parser;
	}

	public function __invoke(
		CommandInterface $command,
		ResponseInterface $response
	) {
		$fn     = $this->parser;
		$result = $fn( $command, $response );

		if ( $command->getName() === 'GetBucketLocation' ) {
			$location = 'us-east-1';
			if ( preg_match( '/>(.+?)<\/LocationConstraint>/', $response->getBody(), $matches ) ) {
				$location = $matches[1] === 'EU' ? 'eu-west-1' : $matches[1];
			}
			$result['LocationConstraint'] = $location;
		}

		return $result;
	}

	public function parseMemberFromStream(
		StreamInterface $stream,
		StructureShape $member,
		$response
	) {
		return $this->parser->parseMemberFromStream( $stream, $member, $response );
	}
}
