<?php

/**
 * Déclarations d'autorisations et utilisations de pipelines
 *
 * @plugin Statistiques pour SPIP
 * @license GNU/GPL
 * @package SPIP\Stats\Pipelines
 */

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

/**
 * Compter les visites sur les pages HTML
 *
 * Uniquement si les statistiques sont activées dans la configuration :
 * - permet de compter par défaut toutes les pages de type HTML
 * - sauf si on explicite, pour une page donnée, l'entête
 *   header `X-Spip-Visites` à `oui` ou `non`.
 *   Indiquer `oui` pour forcer le comptage de la page, ou `non` pour au contraire l'éviter
 *
 * @uses public_stats_dist() si la page doit être comptée.
 * @pipeline affichage_entetes_final
 * @param array $entetes liste des entêtes de la page
 * @return array
 */
function stats_affichage_entetes_final($entetes) {
	if (
		isset($GLOBALS['meta']['activer_statistiques']) and $GLOBALS['meta']['activer_statistiques'] != 'non'
		and !defined('_STATS_INHIB_COMPTER_VISITES_AFFICHAGE_ENTETES_FINAL')
	) {
		$html = preg_match(',^\s*text/html,', $entetes['Content-Type']);

		// decomptage des visites, on peut forcer a oui ou non avec le header X-Spip-Visites
		// par defaut on ne compte que les pages en html (ce qui exclue les js,css et flux rss)
		$spip_compter_visites = $html ? 'oui' : 'non';
		if (isset($entetes['X-Spip-Visites'])) {
			$spip_compter_visites = in_array($entetes['X-Spip-Visites'], ['oui', 'non'])
				? $entetes['X-Spip-Visites']
				: $spip_compter_visites;
			unset($entetes['X-Spip-Visites']);
		}

		// Gestion des statistiques du site public
		if ($spip_compter_visites != 'non') {
			$stats = charger_fonction('stats', 'public');
			$stats();
		}
	}

	return $entetes;
}

/**
 * Ajouter un header Referrer-Policy sur les pages des stats
 * @param array $entetes
 * @return array
 */
function stats_affichage_entetes_final_prive($entetes) {
	if (in_array(_request('exec'), ['stats_referers', 'stats_visites', 'stats_repartition', 'stats_lang'])) {
		$entetes['Referrer-Policy'] = 'origin-when-cross-origin';
	}
	return $entetes;
}

/**
 * Compléter des pages de l'espace privé
 *
 * - Ajoute les formulaire de configuration des statistiques dans les configurations avancées
 * - Ajoute les formulaire de suppression des statistiques dans la maintenance technique
 *
 * @pipeline affiche_milieu
 * @param array $flux Données du pipeline
 * @return array       Données du pipeline
 */
function stats_affiche_milieu($flux) {
	// afficher le formulaire de configuration (activer ou desactiver les statistiques).
	if ($flux['args']['exec'] == 'configurer_avancees') {
		$flux['data'] .= recuperer_fond(
			'prive/squelettes/inclure/configurer',
			['configurer' => 'configurer_compteur']
		);
	}

	// afficher le formulaire de suppression des visites (configuration > maintenance du site).
	if ($flux['args']['exec'] == 'admin_tech') {
		$flux['data'] .= recuperer_fond('prive/squelettes/inclure/admin_stats_archiver', []);
		$flux['data'] .= recuperer_fond('prive/squelettes/inclure/admin_effacer_stats', []);
	}

	return $flux;
}

/**
 * Ajoute les boutons d'administration indiquant la popularité et les visites d'un objet
 *
 * @uses admin_stats()
 * @pipeline formulaire_admin
 * @param array $flux Données du pipeline
 * @return array       Données du pipeline
 */
function stats_formulaire_admin($flux) {
	if (
		isset($flux['args']['contexte']['objet'])
		and $objet = $flux['args']['contexte']['objet']
		and isset($flux['args']['contexte']['id_objet'])
		and $id_objet = $flux['args']['contexte']['id_objet']
	) {
		if ($l = admin_stats($objet, $id_objet, defined('_VAR_PREVIEW') ? _VAR_PREVIEW : '')) {
			$btn = recuperer_fond('prive/bouton/statistiques', [
				'visites' => $l[0],
				'popularite' => $l[1],
				'statistiques' => $l[2],
			]);
			$x = '<!--extra-->';
			$flux['data'] = str_ireplace($x, $btn . $x, $flux['data']);
		}
	}

	return $flux;
}

/**
 * Calcule les visites et popularite d'un objet éditorial
 *
 * @note
 *     Actuellement uniquement valable pour les articles.
 *
 * @param string $objet
 * @param int $id_objet
 * @param string $var_preview
 *     Indique si on est en prévisualisation : pas de statistiques dans ce cas.
 * @return false|array
 *     - false : pas de statistiques disponibles
 *     - array : Tableau les stats `[visites, popularité, url]`
 */
function admin_stats($objet, $id_objet, $var_preview = '') {
	if (
		$GLOBALS['meta']['activer_statistiques'] != 'non'
		and $objet == 'article'
		and !$var_preview
		and autoriser('voirstats')
	) {
		$row = sql_fetsel('visites, popularite', 'spip_articles', "id_article=$id_objet AND statut='publie'");

		if ($row) {
			return [
				intval($row['visites']),
				ceil($row['popularite']),
				str_replace('&amp;', '&', generer_url_ecrire_statistiques($id_objet)),
			];
		}
	}

	return false;
}

/**
 * Génère URL de la page dans l'espace privé permettant de visualiser les statistiques d'un article
 *
 * @param int $id_article
 * @return string URL
 */
function generer_url_ecrire_statistiques($id_article) {
	return generer_url_ecrire('stats_visites', "objet=article&id_objet=$id_article");
}

/**
 * Ajoute le cron de traitement des statistiques et calcul des popularités
 *
 * @pipeline taches_generales_cron
 * @param array $taches_generales
 *     Tableau `[nom de la tache => intervalle en secondes]`
 * @return array
 *     Tableau `[nom de la tache => intervalle en secondes]`
 */
function stats_taches_generales_cron($taches_generales) {

	// stats : toutes les 5 minutes on peut vider un panier de visites
	if (
		isset($GLOBALS['meta']['activer_statistiques'])
		and $GLOBALS['meta']['activer_statistiques'] == 'oui'
	) {
		$taches_generales['visites'] = 300;
		$taches_generales['popularites'] = 7200; # calcul lourd
	}

	return $taches_generales;
}

/**
 * Lister les metas de statistiques et leurs valeurs par défaut
 *
 * @pipeline configurer_liste_metas
 * @param array $metas
 *     Couples nom de la méta => valeur par défaut
 * @return array
 *    Couples nom de la méta => valeur par défaut
 */
function stats_configurer_liste_metas($metas) {
	$metas['activer_statistiques'] = 'non';
	$metas['activer_captures_referers'] = 'non';
	$metas['activer_referers'] = 'oui';

	return $metas;
}

/**
 * Afficher le lien vers la page de statistique sur la vue d'un article dans l'espace privé
 *
 * @pipeline boite_infos
 * @param array $flux Données du pipeline
 * @return array       Données du pipeline
 */
function stats_boite_infos($flux) {
	if ($GLOBALS['meta']['activer_statistiques'] == 'oui') {
		if (
			$flux['args']['type'] == 'article'
			and $id_article = $flux['args']['id']
			and autoriser('voirstats', 'article', $id_article)
		) {
			$visites = sql_getfetsel('visites', 'spip_articles', 'id_article=' . intval($id_article));
			if ($visites > 0) {
				$icone_horizontale = chercher_filtre('icone_horizontale');
				$flux['data'] .= $icone_horizontale(
					generer_url_ecrire('stats_visites', "objet=article&id_objet=$id_article"),
					_T('statistiques:icone_evolution_visites', ['visites' => $visites]),
					'statistique-24.png'
				);
			}
		}
	}

	return $flux;
}
