<?php
/**
 * @package Helix_Ultimate_Framework
 * @author JoomShaper <support@joomshaper.com>
 * @copyright Copyright (c) 2010 - 2021 JoomShaper
 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later
 */
namespace HelixUltimate\Framework\Platform;

defined('_JEXEC') or die();

use Joomla\CMS\Factory;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Filesystem\Folder;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Helper\MediaHelper;

/**
 * Media helper class.
 *
 * @since 1.0.0
 */
class Media
{
	/**
	 * Get Folders.
	 *
	 * @return  void
	 * @since   1.0.0
	 */
	public static function getFolders()
	{
		$media = array();
		$media['status'] = false;
		$media['output'] = Text::_('JINVALID_TOKEN');

		Session::checkToken() or die(json_encode($media));

		$input 	= Factory::getApplication()->input;
		$path 	= $input->post->get('path', '/images', 'PATH');

		$images 	= Folder::files(JPATH_ROOT . $path, '.png|.jpg|.jpeg|.gif|.svg|.ico', false, true);
		$folders 	= Folder::folders(JPATH_ROOT . $path, '.', false, false, array('.svn', 'CVS', '.DS_Store', '__MACOSX', '_spmedia_thumbs'));

		$crumbs = explode('/', ltrim($path, '/'));
		$crumb_url = '';

		$breadcrumb = '<ul class="hu-media-breadcrumb">';

		foreach ($crumbs as $key => $crumb)
		{
			$crumb_url .= '/' . $crumb;

			if (count($crumbs) === ($key + 1))
			{
				$breadcrumb .= '<li class="hu-media-breadcrumb-item active" data-path="' . $crumb_url . '">' . preg_replace('/[-_]+/', ' ', $crumb) . '</li>';
			}
			else
			{
				$breadcrumb .= '<li class="hu-media-breadcrumb-item" data-path="' . $crumb_url . '"><a href="#" data-path="' . $crumb_url . '">' . preg_replace('/[-_]+/', ' ', $crumb) . '</a></li>';
			}
		}

		$breadcrumb .= '</ul>';

		$media['breadcrumbs'] = $breadcrumb;
		$media['path'] = $path;
		$files = array();

		$media['images'] = $images;
		$media['folders'] = $folders;

		$output = '<div id="hu-media-manager">';
		$output .= '<ul class="hu-media clearfix">';

		if (!empty($folders))
		{
			foreach ($folders as $folder)
			{
				$files[$folder] = array(
					'type' => 'folder',
					'folder' => $path . '/' . $folder,
					'name' => $folder
				);
			}
		}

		if (!empty($images))
		{
			foreach ($images as $image)
			{
				$image 			= str_replace('\\', '/', $image);
				$root_path 		= str_replace('\\', '/', JPATH_ROOT);
				$path 			= str_replace($root_path . '/', '', $image);

				$files[basename($path)] = array(
					'type' => 'image',
					'path' => $path,
					'name' => basename($path),
					'preview' => Uri::root() . $path
				);
			}
		}

		if (!empty($files))
		{
			ksort($files);

			foreach ($files as $key => $file)
			{
				if ($file['type'] === 'folder')
				{
					$output .= '<li class="hu-media-folder" data-path="' . $file['folder'] . '">';
					$output .= '<div class="hu-media-thumb">';
					$output .= '<svg width="160" height="160" viewBox="0 0 160 160"><g fill="none" fill-rule="evenodd"><path d="M77.955 53h50.04A3.002 3.002 0 0 1 131 56.007v58.988a4.008 4.008 0 0 1-4.003 4.005H39.003A4.002 4.002 0 0 1 35 114.995V45.99c0-2.206 1.79-3.99 3.997-3.99h26.002c1.666 0 3.667 1.166 4.49 2.605l3.341 5.848s1.281 2.544 5.12 2.544l.005.003z" fill="#71B9F4"></path><path d="M77.955 52h50.04A3.002 3.002 0 0 1 131 55.007v58.988a4.008 4.008 0 0 1-4.003 4.005H39.003A4.002 4.002 0 0 1 35 113.995V44.99c0-2.206 1.79-3.99 3.997-3.99h26.002c1.666 0 3.667 1.166 4.49 2.605l3.341 5.848s1.281 2.544 5.12 2.544l.005.003z" fill="#92CEFF"></path></g></svg>';
					$output .= '</div>';
					$output .= '<span class="hu-media-select"><span class="fas fa-check" aria-hidden="true"></span></span>';
					$output .= '<div class="hu-media-label">' . $file['name'] . '</div>';
					$output .= '</li>';
				}
				else
				{
					$output .= '<li class="hu-media-image" data-path="' . $file['path'] . '" data-preview="' . $file['preview'] . '">';
					$output .= '<div class="hu-media-thumb">';
					$output .= '<img src="' . $file['preview'] . '" alt="">';
					$output .= '</div>';
					$output .= '<span class="hu-media-select"><span class="fas fa-check" aria-hidden="true"></span></span>';
					$output .= '<div class="hu-media-label">' . $file['name'] . '</div>';
					$output .= '</li>';
				}
			}
		}
		else
		{
			// $output .= '<li class="hu-media-folder-empty"></li>';
		}

		$output .= '</ul>';
		$output .= '</div>';

		$media['status'] = true;
		$media['output'] = $output;

		die(json_encode($media));
	}

	public static function deleteMedia()
	{
		$output = array();
		$output['status'] = false;
		$output['message'] = Text::_('JINVALID_TOKEN');

		Session::checkToken() or die(json_encode($output));

		$input 	= Factory::getApplication()->input;
		$path 	= $input->post->get('path', '/images', 'PATH');
		$type	= $input->post->get('type', 'file', 'STRING');

		if ($type === 'file')
		{
			if (File::delete(JPATH_ROOT . '/' . $path))
			{
				$output['status'] = true;
			}
			else
			{
				$output['message'] = "Unable to delete file";
				$output['status'] = false;
			}
		}
		else
		{
			if (Folder::delete(JPATH_ROOT . '/' . $path))
			{
				$output['status'] = true;
			}
			else
			{
				$output['message'] = "Unable to delete folder";
				$output['status'] = false;
			}
		}

		die(json_encode($output));
	}

	public static function createFolder()
	{
		$output = array();
		$output['status'] = false;
		$output['message'] = Text::_('JINVALID_TOKEN');

		Session::checkToken() or die(json_encode($output));

		$input 	= Factory::getApplication()->input;
		$path 	= $input->post->get('path', '/images', 'PATH');
		$folder_name 	= $input->post->get('folder_name', '', 'STRING');

		$absolute_path = JPATH_ROOT . $path . '/' . preg_replace('/\s+/', '-', $folder_name);

		if (Folder::exists($absolute_path))
		{
			$output['message'] = "Folder is already exists.";
			$output['status'] = false;
		}
		else
		{
			if (Folder::create($absolute_path, 0755))
			{
				$output['output'] = self::getFolders();
				$output['status'] = true;
			}
			else
			{
				$output['message'] = "Unable to create folder.";
				$output['status'] = false;
			}
		}

		die(json_encode($output));
	}

	public static function uploadMedia()
	{
		$user   = Factory::getUser();
		$input 	= Factory::getApplication()->input;
		$dir 	= $input->post->get('path', '/images', 'PATH');
		$index 	= $input->post->get('index', '', 'STRING');
		$file 	= $input->files->get('file');
		$authorised = $user->authorise('core.edit', 'com_templates');

		$report = array();
		$report['status'] = false;
		$report['message'] = Text::_('JINVALID_TOKEN');
		$report['index'] = $index;

		Session::checkToken() or die(json_encode($report));

		if ($authorised !== true)
		{
			$report['status'] = false;
			$report['message'] = Text::_('JERROR_ALERTNOAUTHOR');
			echo json_encode($report);
			die();
		}

		if (!empty($file))
		{
			if ($file['error'] === UPLOAD_ERR_OK)
			{
				$error = false;
				$params 		= ComponentHelper::getParams('com_media');
				$contentLength 	= (int) $_SERVER['CONTENT_LENGTH'];

				$mediaHelper = new MediaHelper;
				$postMaxSize = $mediaHelper->toBytes(ini_get('post_max_size'));
				$memoryLimit = $mediaHelper->toBytes(ini_get('memory_limit'));

				// Check for the total size of post back data.
				if (($postMaxSize > 0 && $contentLength > $postMaxSize) || ($memoryLimit !== -1 && $contentLength > $memoryLimit))
				{
					$report['status'] = false;
					$report['message'] = Text::_('COM_SPPAGEBUILDER_MEDIA_MANAGER_MEDIA_TOTAL_SIZE_EXCEEDS');
					$error = true;
					echo json_encode($report);
					die();
				}

				$uploadMaxSize = $params->get('upload_maxsize', 0) * 1024 * 1024;
				$uploadMaxFileSize = $mediaHelper->toBytes(ini_get('upload_max_filesize'));

				if (($file['error'] === 1) || ($uploadMaxSize > 0 && $file['size'] > $uploadMaxSize) || ($uploadMaxFileSize > 0 && $file['size'] > $uploadMaxFileSize))
				{
					$report['status'] = false;
					$report['message'] = Text::_('COM_SPPAGEBUILDER_MEDIA_MANAGER_MEDIA_LARGE');
					$error = true;
				}

				// File formats
				$accepted_file_formats = array('jpg', 'jpeg', 'png', 'gif', 'svg', 'ico');

				// Upload if no error found
				if (!$error)
				{
					$file_ext = strtolower(File::getExt($file['name']));

					if (in_array($file_ext, $accepted_file_formats))
					{
						$name = $file['name'];
						$source_path = $file['tmp_name'];
						$folder = ltrim($dir, '/');

						// Do no override existing file
						$media_file = preg_replace('#\s+#', "-", File::makeSafe(basename(strtolower($name))));
						$i = 0;

						do
						{
							$base_name  = File::stripExt($media_file) . ($i ? "$i" : "");
							$ext        = File::getExt($media_file);
							$media_name = $base_name . '.' . $ext;
							$i++;
							$dest       = \JPATH_ROOT . '/' . $folder . '/' . $media_name;
							$src        = $folder . '/' . $media_name;
						}
						while (file_exists($dest));

						// End Do not override
						if (File::upload($source_path, $dest, false, true))
						{
							$report['src'] = Uri::root(true) . '/' . $src;
							$report['status'] = true;
							$report['title'] = $media_name;
							$report['path'] = $src;

							$output = '<div class="hu-media-thumb">';
							$output .= '<img src="' . $report['src'] . '" alt="">';
							$output .= '</div>';
							$output .= '<span class="hu-media-select"><span class="fas fa-check" aria-hidden="true"></span></span>';
							$output .= '<div class="hu-media-label">' . $report['title'] . '</div>';

							$report['output'] = $output;
						}
						else
						{
							$report['status'] = false;
							$report['message'] = Text::_('COM_SPPAGEBUILDER_MEDIA_MANAGER_UPLOAD_FAILED');
						}
					}
					else
					{
						$report['status'] = false;
						$report['message'] = Text::_('COM_SPPAGEBUILDER_MEDIA_MANAGER_FILE_NOT_SUPPORTED');
					}
				}
			}
		}
		else
		{
			$report['status'] = false;
			$report['message'] = Text::_('File not found');
		}

		die(json_encode($report));
	}
}
