<?php
/**
 * Akeeba Engine
 * The PHP-only site backup engine
 *
 * @copyright Copyright (c)2006-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU GPL version 3 or, at your option, any later version
 * @package   akeebaengine
 */

namespace Akeeba\Engine\Postproc;

// Protection against direct access
defined('AKEEBAENGINE') or die();

use Akeeba\Engine\Base\BaseObject;

/**
 * Akeeba Engine post processing abstract class
 *
 * @author Nicholas
 *
 */
abstract class Base extends BaseObject
{
	/** @var bool Should we break the step before post-processing? */
	public $break_before = true;

	/** @var bool Should we break the step after post-processing? */
	public $break_after = true;

	/** @var bool Does this engine processes the files in a way that makes deleting the originals safe? */
	public $allow_deletes = true;

	/** @var bool Does this engine support remote file deletes? */
	public $can_delete = false;

	/** @var bool Does this engine support downloads to files? */
	public $can_download_to_file = false;

	/** @var bool Does this engine support downloads to browser? */
	public $can_download_to_browser = false;

	/** @var bool Set to true if raw data will be dumped to the browser when downloading the file to the browser. Set to false if a URL is returned instead. */
	public $downloads_to_browser_inline = false;

	/**
	 * The remote absolute path to the file which was just processed. Leave null if the file is meant to
	 * be non-retrievable, i.e. sent to email or any other one way service.
	 *
	 * @var string
	 */
	public $remote_path = null;

	/**
	 * This function takes care of post-processing a backup archive's part, or the
	 * whole backup archive if it's not a split archive type. If the process fails
	 * it should return false. If it succeeds and the entirety of the file has been
	 * processed, it should return true. If only a part of the file has been uploaded,
	 * it must return 1.
	 *
	 * @param   string $absolute_filename Absolute path to the part we'll have to process
	 * @param   string $upload_as         Base name of the uploaded file, skip to use $absolute_filename's
	 *
	 * @return  boolean|integer  False on failure, true on success, 1 if more work is required
	 */
	public abstract function processPart($absolute_filename, $upload_as = null);

	/**
	 * Deletes a remote file
	 *
	 * @param $path string Absolute path to the file we're deleting
	 *
	 * @return bool|int False on failure, true on success, 1 if more work is required
	 */
	public function delete($path)
	{
		return false;
	}

	/**
	 * Downloads a remote file to a local file, optionally doing a range download. If the
	 * download fails we return false. If the download succeeds we return true. If range
	 * downloads are not supported, -1 is returned and nothing is written to disk.
	 *
	 * @param $remotePath string The path to the remote file
	 * @param $localFile  string The absolute path to the local file we're writing to
	 * @param $fromOffset int|null The offset (in bytes) to start downloading from
	 * @param $length     int|null The amount of data (in bytes) to download
	 *
	 * @return bool|int True on success, false on failure, -1 if ranges are not supported
	 */
	public function downloadToFile($remotePath, $localFile, $fromOffset = null, $length = null)
	{
		return false;
	}

	/**
	 * Returns a public download URL or starts a browser-side download of a remote file.
	 * In the case of a public download URL, a string is returned. If a browser-side
	 * download is initiated, it returns true. In any other case (e.g. unsupported, not
	 * found, etc) it returns false.
	 *
	 * @param $remotePath string The file to download
	 *
	 * @return string|bool
	 */
	public function downloadToBrowser($remotePath)
	{
		return false;
	}

	/**
	 * Used to call arbitrary methods in this engine through an AJAX call
	 *
	 * @param string $method The method to call.
	 * @param array  $params Any parameters to send to the method, in array format
	 *
	 * @return mixed Whatever the method has to return. It will be JSON encoded by the AJAX handler.
	 */
	public function customAPICall($method, $params = array())
	{
		if ( !method_exists($this, $method))
		{
			header('HTTP/1.0 501 Not Implemented');
			exit();
		}
		else
		{
			return call_user_func_array(array($this, $method), array($params));
		}
	}

	/**
	 * Opens an OAuth window (perform redirection), or return false if this is not supported
	 *
	 * @param array $params Any parameters required to launch OAuth
	 *
	 * @return boolean|void False if not supported, or nothing (redirection performed) otherwise.
	 */
	public function oauthOpen($params = array())
	{
		return false;
	}
}
