<?php

/**
 * Returns the temporary folder path that silverstripe should use for its cache files.
 *
 * @param string $base The base path to use for determining the temporary path
 * @return string Path to temp
 */
function getTempFolder($base = null) {
	$parent = getTempParentFolder($base);

	// The actual temp folder is a subfolder of getTempParentFolder(), named by username
	$subfolder = $parent . DIRECTORY_SEPARATOR . getTempFolderUsername();

	if(!@file_exists($subfolder)) {
		mkdir($subfolder);
	}

	return $subfolder;
}

/**
 * Returns as best a representation of the current username as we can glean.
 *
 * @return string
 */
function getTempFolderUsername() {
	$user = getenv('APACHE_RUN_USER');
	if(!$user) $user = getenv('USER');
	if(!$user) $user = getenv('USERNAME');
	if(!$user && function_exists('posix_getuid')) {
		$userDetails = posix_getpwuid(posix_getuid());
		$user = $userDetails['name'];
	}
	if(!$user) $user = 'unknown';
	$user = preg_replace('/[^A-Za-z0-9_\-]/', '', $user);
	return $user;
}

/**
 * Return the parent folder of the temp folder.
 * The temp folder will be a subfolder of this, named by username.
 * This structure prevents permission problems.
 *
 * @param string $base
 * @return string
 * @throws Exception
 */
function getTempParentFolder($base = null) {
	if(!$base && defined('BASE_PATH')) $base = BASE_PATH;

	$worked = true;

	// first, try finding a silverstripe-cache dir built off the base path
	$tempPath = $base . DIRECTORY_SEPARATOR . 'silverstripe-cache';
	if(@file_exists($tempPath)) {
		if((fileperms($tempPath) & 0777) != 0777) {
			@chmod($tempPath, 0777);
		}
		return $tempPath;
	}

	// failing the above, try finding a namespaced silverstripe-cache dir in the system temp
	$tempPath = sys_get_temp_dir() . DIRECTORY_SEPARATOR .
		'silverstripe-cache-php' . preg_replace('/[^\w-\.+]+/', '-', PHP_VERSION) .
		str_replace(array(' ', '/', ':', '\\'), '-', $base);
	if(!@file_exists($tempPath)) {
		$oldUMask = umask(0);
		$worked = @mkdir($tempPath, 0777);
		umask($oldUMask);

	// if the folder already exists, correct perms
	} else {
		if((fileperms($tempPath) & 0777) != 0777) {
			@chmod($tempPath, 0777);
		}
	}

	// failing to use the system path, attempt to create a local silverstripe-cache dir
	if(!$worked) {
		$worked = true;
		$tempPath = $base . DIRECTORY_SEPARATOR . 'silverstripe-cache';
		if(!@file_exists($tempPath)) {
			$oldUMask = umask(0);
			$worked = @mkdir($tempPath, 0777);
			umask($oldUMask);
		}
	}

	if(!$worked) {
		throw new Exception(
			'Permission problem gaining access to a temp folder. ' .
			'Please create a folder named silverstripe-cache in the base folder ' .
			'of the installation and ensure it has the correct permissions'
		);
	}

	return $tempPath;
}