<?php
/*
 * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

/*
	PREREQUISITES:
	In order to run this sample, I'll assume a few things:

	* You already have a valid Amazon Web Services developer account, and are
	  signed up to use Amazon S3 <http://aws.amazon.com/s3>.

	* You already understand the fundamentals of object-oriented PHP.

	* You've verified that your PHP environment passes the SDK Compatibility Test.

	* You've already added your credentials to your config.inc.php file, as per the
	  instructions in the Getting Started Guide.

	TO RUN:
	* Run this file on your web server by loading it in your browser, OR...
	* Run this file from the command line with `php cli-s3_get_urls_for_uploads.php`.
*/


/*%******************************************************************************************%*/
// SETUP

	// Enable full-blown error reporting. http://twitter.com/rasmus/status/7448448829
	error_reporting(-1);

	// Set plain text headers
	header("Content-type: text/plain; charset=utf-8");

	// Include the SDK
	require_once '../sdk.class.php';


/*%******************************************************************************************%*/
// UPLOAD FILES TO S3

	// Instantiate the AmazonS3 class
	$s3 = new AmazonS3();

	// Determine a completely unique bucket name (all lowercase)
	$bucket = 'php-sdk-getting-started-' . strtolower($s3->key) . '-' . time();

	// Create our new bucket in the US-West region.
	$create_bucket_response = $s3->create_bucket($bucket, AmazonS3::REGION_US_W1);

	// Provided that the bucket was created successfully...
	if ($create_bucket_response->isOK())
	{
		/* Since AWS follows an "eventual consistency" model, sleep and poll
		   until the bucket is available. */
		$exists = $s3->if_bucket_exists($bucket);
		while (!$exists)
		{
			// Not yet? Sleep for 1 second, then check again
			sleep(1);
			$exists = $s3->if_bucket_exists($bucket);
		}

		/*
			Get a list of files to upload. We'll use some helper functions we've
			defined below. This assumes that you have a directory called "test_files"
			that actually contains some files you want to upload.
		*/
		$list_of_files = filter_file_list(glob('./test_files/*'));

		// Prepare to hold the individual filenames
		$individual_filenames = array();

		// Loop over the list, referring to a single file at a time
		foreach ($list_of_files as $file)
		{
			// Grab only the filename part of the path
			$filename = explode(DIRECTORY_SEPARATOR, $file);
			$filename = array_pop($filename);

			// Store the filename for later use
			$individual_filenames[] = $filename;

			/* Prepare to upload the file to our new S3 bucket. Add this
			   request to a queue that we won't execute quite yet. */
			$s3->batch()->create_object($bucket, $filename, array(
				'fileUpload' => $file
			));
		}

		/* Execute our queue of batched requests. This may take a few seconds to a
		   few minutes depending on the size of the files and how fast your upload
		   speeds are. */
		$file_upload_response = $s3->batch()->send();

		/* Since a batch of requests will return multiple responses, let's
		   make sure they ALL came back successfully using `areOK()` (singular
		   responses use `isOK()`). */
		if ($file_upload_response->areOK())
		{
			// Loop through the individual filenames
			foreach ($individual_filenames as $filename)
			{
				/* Display a URL for each of the files we uploaded. Since uploads default to
				   private (you can choose to override this setting when uploading), we'll
				   pre-authenticate the file URL for the next 5 minutes. */
				echo $s3->get_object_url($bucket, $filename, '5 minutes') . PHP_EOL . PHP_EOL;
			}
		}
	}


/*%******************************************************************************************%*/
// HELPER FUNCTIONS

	// Filters the list for only files
	function filter_file_list($arr)
	{
		return array_values(array_filter(array_map('file_path', $arr)));
	}

	// Callback used by filter_file_list()
	function file_path($file)
	{
		return !is_dir($file) ? realpath($file) : null;
	}
