<?php

/**
 * Utilisations de pipelines par Big Upload
 *
 * @plugin     Big Upload
 * @copyright  2015
 * @author     Matthieu Marcillaud
 * @licence    GNU/GPL
 * @package    SPIP\Bigup\Pipelines
 */

if (!defined('_ECRIRE_INC_VERSION')) { return;
}

/**
 * Charger des scripts jquery
 *
 * @pipeline jquery_plugins
 * @param array $scripts Liste à charger
 * @return array Liste complétée
**/
function bigup_jquery_plugins($scripts) {
	include_spip('inc/config');
	if (test_espace_prive() or lire_config('bigup/charger_public', false)) {
		$scripts[] = 'javascript/bigup.utils.js';
		$scripts[] = produire_fond_statique('javascript/bigup.trads.js', [
			'lang' => $GLOBALS['spip_lang'],
		]);
		$scripts[] = 'lib/flow/flow.js';

		$bigupConfig = bigup_config();
		if ($bigupConfig['clientWidth'] or $bigupConfig['clientHeight']) {
			$scripts[] = 'lib/load_image/load-image.all.min.js';
		}
		$scripts[] = 'javascript/bigup.js';
		$scripts[] = 'javascript/bigup.loader.js';
	}
	return $scripts;
}

/**
 * Charger des JS dans l’espace public
 *
 * @pipeline insert_head_css
 * @param string $flux Code html des styles CSS à charger
 * @return string Code html complété
 **/
function bigup_insert_head($flux) {
	include_spip('inc/config');
	if (lire_config('bigup/charger_public', false)) {
		$flux = bigup_header_prive($flux);
	}
	return $flux;
}


function bigup_config():array {
	include_spip('inc/config');
	$maxFileSize = intval(lire_config('bigup/max_file_size', 0));
	include_spip('inc/filtres_images_lib_mini');
	if (function_exists('_image_extensions_logos')) {
		$formatLogos = _image_extensions_logos();
	} else {
		$formatLogos = $GLOBALS['formats_logos'];
	}
	if (defined('_IMG_MAX_WIDTH') or defined('_IMG_MAX_HEIGHT')) {
		$clientWidth   = defined('_IMG_MAX_WIDTH') ? (int) _IMG_MAX_WIDTH : 0;
		$clientHeight  = defined('_IMG_MAX_HEIGHT') ? (int) _IMG_MAX_HEIGHT : 0;
		$clientQuality = defined('_IMG_GD_QUALITE') ? (int) _IMG_GD_QUALITE : 85;
	} else {
		$clientWidth   = intval(lire_config('bigup/client_width'));
		$clientHeight  = intval(lire_config('bigup/client_height'));
		$clientQuality = intval(lire_config('bigup/client_quality'));
	}

	return [
		'clientWidth' => $clientWidth,
		'clientHeight' => $clientHeight,
		'clientQuality' => $clientQuality,
		'maxFileSize' => $maxFileSize,
		'formats_logos' => $formatLogos
	];
}

/**
 * Charger des JS dans l’espace prive
 *
 * @pipeline insert_head_css
 * @param string $flux Code html des styles CSS à charger
 * @return string Code html complété
 **/
function bigup_header_prive($flux) {
	$bigupConfig = bigup_config();
	$bigupConfig = json_encode($bigupConfig, JSON_THROW_ON_ERROR);
	$flux .= <<<EOS
<script type='text/javascript'>jQuery.bigup_config = $bigupConfig</script>
EOS;
	return $flux;
}

/**
 * Charger des styles CSS dans l’espace public
 *
 * @pipeline insert_head_css
 * @param string $flux Code html des styles CSS à charger
 * @return string Code html complété
**/
function bigup_insert_head_css($flux) {
	include_spip('inc/config');
	if (lire_config('bigup/charger_public', false)) {
		$flux = bigup_header_prive_css($flux);
	}
	return $flux;
}

/**
 * Charger des styles CSS dans l'espace privé
 *
 * @pipeline insert_head_css
 * @param string $flux Code html des styles CSS à charger
 * @return string Code html complété
**/
function bigup_header_prive_css($flux) {
	$flux .= '<link rel="stylesheet" href="' . produire_fond_statique('css/vignettes.css') . '" type="text/css" />' . "\n";
	$flux .= '<link rel="stylesheet" href="' . timestamp(find_in_path('css/bigup.css')) . '" type="text/css" />' . "\n";
	return $flux;
}


/**
 * Obtenir une instance de la classe bigup pour ce formulaire
 *
 * @param array $flux
 *     Flux, tel que présent dans les pipelines des formulaires CVT
 * @return \SPIP\Bigup\Bigup()
**/
function bigup_get_bigup($flux) {
	include_spip('inc/Bigup');
	$bigup = new \Spip\Bigup\Bigup(
		\Spip\Bigup\Identifier::depuisArgumentsPipeline($flux['args'])
	);
	return $bigup;
}

/**
 * Recherche de fichiers uploadés pour ce formulaire
 *
 * La recherche est conditionné par la présence dans le contexte
 * de la clé `_bigup_rechercher_fichiers`. Ceci permet d'éviter de chercher
 * des fichiers pour les formulaires qui n'en ont pas besoin.
 *
 * Réinsère les fichiers déjà présents pour ce formulaire
 * dans `$_FILES` (a priori assez peu utile dans le chargement)
 * et ajoute la description des fichiers présents pour chaque champ,
 * dans l'environnement.
 *
 * Ajoute également un hidden, qui s'il est posté, demandera à recréer `$_FILES`
 * juste avant la fonction verifier(). Voir `bigup_formulaire_receptionner()`
 *
 * @see bigup_formulaire_receptionner():
 * @param array $flux
 * @return array
**/
function bigup_formulaire_charger($flux) {

	if (empty($flux['data']['_bigup_rechercher_fichiers'])) {
		return $flux;
	}

	// s'il y a des fichiers pour ce formulaire / visiteur, on ajoute la liste à l'environnement.
	$bigup = bigup_get_bigup($flux);
	if ($fichiers = $bigup->retrouver_fichiers()) {
		$flux['data']['_bigup_fichiers'] = [];
		foreach ($fichiers as $racine => $listes) {
			$flux['data']['_bigup_fichiers'][$racine] = $fichiers[$racine];
		}
	}

	if (empty($flux['data']['_hidden'])) {
		$flux['data']['_hidden'] = '';
	}

	$token_retrouver_fichiers = $bigup->creer_jeton_retrouver_fichiers();
	$flux['data']['_hidden'] .= '<input type="hidden" name="bigup_retrouver_fichiers" value="' . $token_retrouver_fichiers . '" />';

	return $flux;
}


/**
 * Branchement sur la réception d'un formulaire (avant verifier())
 *
 * On remet `$_FILES` avec les fichiers présents pour ce formulaire,
 * et avant que la fonction verifier native du formulaire soit utilisée,
 * de sorte qu'elle ait accès à $_FILES rempli.
 *
 * @pipeline formulaire_receptionner
 * @param array $flux
 * @return array
 */
function bigup_formulaire_receptionner($flux) {
	if ($token_retrouver_fichiers = _request('bigup_retrouver_fichiers')) {
		$bigup = bigup_get_bigup($flux);
		if ($bigup->verifier_jeton_retrouver_fichiers($token_retrouver_fichiers)) {
			$bigup->gerer_fichiers_postes(); // les fichiers postés sans JS
			$liste = $bigup->reinserer_fichiers(_request('bigup_reinjecter_uniquement'));
			$bigup->surveiller_fichiers($liste);
		}
	}
	return $flux;
}

/**
 * Branchement sur verifier
 *
 * - Si on a demandé la suppression d'un fichier, le faire
 * - Nettoyer les fichiers injectés effacés de $_FILES.
 *
 * @param array $flux
 * @return array
**/
function bigup_formulaire_verifier($flux) {
	// enlever un fichier dont on demande sa suppression
	if ($identifiant = _request('bigup_enlever_fichier')) {
		$bigup = bigup_get_bigup($flux);
		if ($bigup->supprimer_fichiers($identifiant)) {
			// on n'affiche pas les autres erreurs
			$flux['data'] = [];
			$flux['data']['message_erreur'] = '';
			$flux['data']['message_ok'] = _T('bigup:fichier_efface');
			$flux['data']['_erreur'] = true;
		}
	}
	// nettoyer nos fichiers réinsérés s'ils ont été enlevés de $_FILES
	elseif ($token_retrouver_fichiers = _request('bigup_retrouver_fichiers')) {
		$bigup = bigup_get_bigup($flux);
		if ($bigup->verifier_jeton_retrouver_fichiers($token_retrouver_fichiers)) {
			$bigup->verifier_fichiers_surveilles();
		}
	}

	return $flux;
}


/**
 * Branchement sur traiter
 *
 * - Si on a effectué les traitements sans erreur,
 * tous les fichiers restants doivent disparaître
 * du cache.
 * - Nettoyer les fichiers injectés effacés de $_FILES.
 *
 * @param array $flux
 * @return array
 **/
function bigup_formulaire_traiter($flux) {
	if ($token_retrouver_fichiers = _request('bigup_retrouver_fichiers')) {
		$bigup = bigup_get_bigup($flux);
		if ($bigup->verifier_jeton_retrouver_fichiers($token_retrouver_fichiers)) {
			// à voir si on cherche systématiquement
			// ou uniquement lorsqu'on a demandé à recuperer les fichiers
			if (empty($flux['data']['message_erreur'])) {
				$bigup->supprimer_fichiers(_request('bigup_reinjecter_uniquement'));
			} else {
				// nettoyer nos fichiers réinsérés s'ils ont été enlevés de $_FILES
				$bigup->verifier_fichiers_surveilles();
			}
		}
	}
	return $flux;
}

/**
 * Liste les formulaires où BigUP se charge automatiquement
 * (necessite un traitement spécifique)
 *
 * @return array
 */
function bigup_medias_formulaires_traitements_automatiques() {
	return [
		'configurer_ecran_connexion',
		'editer_logo',
		'editer_document',
		'illustrer_document',
		'formidable',
		'joindre_document',
	];
}

/**
 * Ajouter bigup sur certains formulaires
 *
 * - le documents du plugin Medias
 * - le formulaire de logo de SPIP
 *
 * @param array $flux
 * @return array
 **/
function bigup_medias_formulaire_charger($flux) {
	if (
		in_array($flux['args']['form'], bigup_medias_formulaires_traitements_automatiques())
		and is_array($flux['data'])
	) {
		$flux['data']['_bigup_rechercher_fichiers'] = true;
	}
	return $flux;
}

/**
 * Utiliser Bigup sur certains formulaires
 *
 * - le documents du plugin Medias
 * - le formulaire de logo de SPIP
 *
 * @param array $flux
 * @return array
 **/
function bigup_medias_formulaire_fond($flux) {
	include_spip('inc/config');

	if (
		(test_espace_prive() or lire_config('bigup/charger_public'))
		and !empty($flux['args']['contexte']['_bigup_rechercher_fichiers'])
		and $form = $flux['args']['form']
		and $bigup_medias_formulaire = charger_fonction('bigup_medias_formulaire_' . $form, 'inc', true)
	) {
		$bigup = bigup_get_bigup(['args' => $flux['args']['contexte']]);
		$formulaire = $bigup->formulaire($flux['data'], $flux['args']['contexte']);

		$formulaire = $bigup_medias_formulaire($flux['args'], $formulaire);

		$flux['data'] = $formulaire->get();
	}

	return $flux;
}

/**
 * @param array $args
 * @param \Spip\Bigup\Formulaire $formulaire
 * @return \Spip\Bigup\Formulaire
 */
function inc_bigup_medias_formulaire_joindre_document_dist($args, $formulaire) {
	$formulaire->preparer_input(
		'fichier_upload[]',
		[
			'previsualiser' => true,
			'drop-zone-extended' => '#contenu'
		]
	);
	$formulaire->inserer_js('bigup.documents.js');
	return $formulaire;
}

/**
 * @param array $args
 * @param \Spip\Bigup\Formulaire $formulaire
 * @return \Spip\Bigup\Formulaire
 */
function inc_bigup_medias_formulaire_editer_document_dist($args, $formulaire) {
	$formulaire->preparer_input(
		'fichier_upload[]',
		[
			'multiple' => false,
			'previsualiser' => true
		]
	);
	$formulaire->inserer_js('bigup.documents_edit.js');
	return $formulaire;
}

/**
 * @param array $args
 * @param \Spip\Bigup\Formulaire $formulaire
 * @return \Spip\Bigup\Formulaire
 */
function inc_bigup_medias_formulaire_illustrer_document_dist($args, $formulaire) {
	$formulaire->preparer_input(
		'fichier_upload[]',
		[
			'multiple' => false,
			'accept' => bigup_get_accept_logos(),
			'previsualiser' => true,
			'input_class' => 'bigup_illustration',
			'drop-zone-extended' => '.formulaire_illustrer_document .editer_fichier',
		]
	);
	$formulaire->inserer_js('bigup.documents_illustrer.js');
	return $formulaire;
}

/**
 * @param array $args
 * @param \Spip\Bigup\Formulaire $formulaire
 * @return \Spip\Bigup\Formulaire
 */
function inc_bigup_medias_formulaire_editer_logo_dist($args, $formulaire) {
	$options = [
		'accept' => bigup_get_accept_logos(
			[
				'objet' => $args['contexte']['objet'],
				'id_objet' => $args['contexte']['id_objet']
			]
		),
		'previsualiser' => true,
		'input_class' => 'bigup_logo',
	];
	if (intval($args['args'][1]) or $args['args'][0] !== 'site') {
		$options['drop-zone-extended'] = '#navigation';
	}
	$formulaire->preparer_input(
		['logo_on', 'logo_off'],
		$options
	);
	$formulaire->inserer_js('bigup.logos.js');
	return $formulaire;
}

/**
 * @param array $args
 * @param \Spip\Bigup\Formulaire $formulaire
 * @return \Spip\Bigup\Formulaire
 */
function inc_bigup_medias_formulaire_formidable_dist($args, $formulaire) {
	$formulaire->preparer_input_class(
		'bigup', // 'file' pour rendre automatique.
		['previsualiser' => true]
	);
	return $formulaire;
}


/**
 * @param array $args
 * @param \Spip\Bigup\Formulaire $formulaire
 * @return \Spip\Bigup\Formulaire
 */
function inc_bigup_medias_formulaire_configurer_ecran_connexion_dist($args, $formulaire) {
	$formulaire->preparer_input(
		'upload_image_fond_login',
		[
			'multiple' => false,
			'previsualiser' => true,
			'input_class' => 'bigup_simple',
		]
	);
	$formulaire->inserer_js('bigup.simples.js');
	return $formulaire;
}

/**
 * Ajoute la configuration des documents à la page de configuration des contenus
 *
 * @pipeline affiche_milieu
 * @param array $flux
 * @return array
 */
function bigup_affiche_milieu(array $flux) : array {
	if ($flux['args']['exec'] === 'configurer_avancees') {
		$flux['data'] .= recuperer_fond(
			'prive/squelettes/inclure/configurer',
			['configurer' => 'configurer_bigup']
		);
	}

	return $flux;
}
