<?php

namespace Aws\CloudTrail;

use Aws\S3\S3Client;

/**
 * This class provides an easy way to read log files generated by AWS
 * CloudTrail.
 *
 * CloudTrail log files contain data about your AWS API calls and are stored in
 * Amazon S3. The log files are gzipped and contain structured data in JSON
 * format. This class will automatically ungzip and decode the data, and return
 * the data as a array of log records
 */
class LogFileReader {
	/** @var S3Client S3 client used to perform GetObject operations */
	private $s3Client;

	/**
	 * @param S3Client $s3Client S3 client used to retrieve objects
	 */
	public function __construct( S3Client $s3Client ) {
		$this->s3Client = $s3Client;
	}

	/**
	 * Downloads, unzips, and reads a CloudTrail log file from Amazon S3
	 *
	 * @param string $s3BucketName The bucket name of the log file in Amazon S3
	 * @param string $logFileKey The key of the log file in Amazon S3
	 *
	 * @return array
	 */
	public function read( $s3BucketName, $logFileKey ) {
		// Create a command for getting the log file object
		$command = $this->s3Client->getCommand( 'GetObject', [
			'Bucket'                  => (string) $s3BucketName,
			'Key'                     => (string) $logFileKey,
			'ResponseContentEncoding' => 'x-gzip'
		] );

		// Make sure gzip encoding header is sent and accepted in order to
		// inflate the response data.
		$command['@http']['headers']['Accept-Encoding'] = 'gzip';

		// Get the JSON response data and extract the log records
		$result  = $this->s3Client->execute( $command );
		$logData = json_decode( $result['Body'], true );

		return isset( $logData['Records'] ) ? $logData['Records'] : [];
	}
}
