<?php

/**
 * SPIP, Système de publication pour l'internet
 *
 * Copyright © avec tendresse depuis 2001
 * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
 *
 * Ce programme est un logiciel libre distribué sous licence GNU/GPL.
 */

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

/**
 * Tourner un document
 *
 * lorsque les arguments sont passes dans arg en GET :
 * id_document-angle
 *
 * @param int $id_document
 * @param int $angle
 *   angle de rotation en degre>0
 */
function action_tourner_dist($id_document = null, $angle = null) {
	if ($id_document === null or $angle === null) {
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();

		if (!preg_match(',^\W*(\d+)\W?(-?\d+)$,', $arg, $r)) {
			spip_log("action_tourner_dist $arg pas compris");
		} else {
			array_shift($r);
			[$id_document, $angle] = $r;
		}
	}
	if ($id_document and autoriser('modifier', 'document', $id_document)) {
		action_tourner_post($id_document, $angle);
	}
}

/**
 * Tourner un document
 *
 * @param int $id_document
 * @param int $angle
 *   angle de rotation en degre>0
 */
function action_tourner_post($id_document, $angle) {
	$row = sql_fetsel('fichier,extension,media', 'spip_documents', 'id_document=' . intval($id_document));

	if (!$row || $row['media'] !== 'image') {
		return;
	}

	include_spip('inc/charsets');  # pour le nom de fichier
	include_spip('inc/documents');
	// Fichier destination : on essaie toujours de repartir de l'original
	$var_rot = $angle;
	$effacer = false;

	include_spip('inc/distant'); # pour copie_locale
	$source = get_spip_doc($row['fichier']);

	$callback_valider_url = null;
	if (tester_url_absolue($source)) {
		if (!valider_url_distante($source)) {
			return;
		}
		$callback_valider_url = 'valider_url_distante';
	}

	$src = _DIR_RACINE . copie_locale($source, 'auto', null, null, $callback_valider_url);

	if (preg_match(',^(.*)-r(90|180|270)\.([^.]+)$,', $src, $match)) {
		$effacer = $src;
		$src = $match[1] . '.' . $match[3];
		$var_rot += intval($match[2]);
	}
	$var_rot = ((360 + $var_rot) % 360); // 0, 90, 180 ou 270

	if ($var_rot > 0) {
		$dest = preg_replace(',\.[^.]+$,', '-r' . $var_rot . '$0', $src);
		spip_log("rotation $var_rot $src : $dest");

		include_spip('inc/filtres');
		include_spip('public/parametrer'); // charger les fichiers fonctions #bugfix spip 2.1.0
		$res = filtrer('image_rotation', $src, $var_rot);
		$src = extraire_attribut($res, 'src');
		$src = supprimer_timestamp($src);
		$src = explode('.', $src);
		if (end($src) !== $row['extension']) {
			$res = filtrer('image_format', $res, $row['extension']);
		}

		[$hauteur, $largeur] = taille_image($res);
		$res = extraire_attribut($res, 'src');

		include_spip('inc/getdocument');
		deplacer_fichier_upload($res, $dest);
	} else {
		$dest = $src;
		$size_image = @spip_getimagesize($dest);
		$largeur = $size_image[0];
		$hauteur = $size_image[1];
	}

	// succes !
	if ($largeur > 0 and $hauteur > 0) {
		$set = [
			'fichier' => set_spip_doc($dest),
			'largeur' => $largeur,
			'hauteur' => $hauteur,
			'distant' => 'non', // le document n'est plus distant apres une transformation
		];
		if ($taille = @filesize($dest)) {
			$set['taille'] = $taille;
		}
		sql_updateq('spip_documents', $set, 'id_document=' . intval($id_document));
		if ($effacer) {
			spip_log("rotation : j'efface $effacer");
			spip_unlink($effacer);
		}
		// pipeline pour les plugins
		pipeline(
			'post_edition',
			[
				'args' => [
					'table' => 'spip_documents',
					'table_objet' => 'documents',
					'spip_table_objet' => 'spip_documents',
					'type' => 'document',
					'id_objet' => $id_document,
					'champs' => [
						'rotation' => $angle,
						'orientation' => $var_rot,
						'fichier' => $row['fichier'],
					],
					'action' => 'tourner',
				],
				'data' => $set,
			]
		);
	}
}

// Appliquer l'EXIF orientation
// cf. http://trac.rezo.net/trac/spip/ticket/1494
function tourner_selon_exif_orientation($id_document, $fichier) {

	if (
		function_exists('exif_read_data')
		and $exif = exif_read_data($fichier)
		and (
			$ort = $exif['IFD0']['Orientation']
			or $ort = $exif['Orientation'])
	) {
		spip_log("rotation: $ort");
		$rot = null;
		switch ($ort) {
			case 3:
				$rot = 180;
				// rotation à 180
				// no break
			case 6:
				$rot = 90;
				// rotation à 90
				// no break
			case 8:
				$rot = -90;
		}
		if ($rot) {
			action_tourner_post([null, $id_document, $rot]);
		}
	}
}
