<?php

/**
 * Déclaration des autorisations
 *
 * @package SPIP\Formidable\Autorisations
**/

// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

include_spip('action/editer_liens');
include_spip('inc/config');

/**
 * Autorisation par auteur et par formulaire
 *
 * Seuls les auteurs associés à un formulaire peuvent y accéder
 *
 * @param  int   $id        id du formulaire à tester
 * @param  int   $id_auteur id de l'auteur à tester, si ==0 => auteur courant
 * @return bool  true s'il a le droit, false sinon
 *
*/
function formidable_autoriser_par_auteur($id_formulaire, $id_auteur = 0) {
	if ($id_formulaire == 0) {
		return true;
	}

	$retour = false;

	if ($id_auteur == 0) {
		include_spip('inc/session');
		$id_auteur = session_get('id_auteur');
	}

	// Si on a bien un id_auteur
	if (($id_auteur = intval($id_auteur)) > 0) {
		// On cherche si cet auteur est lié à ce formulaire
		$autorisations = objet_trouver_liens(array('formulaire' => $id_formulaire), array('auteur' => $id_auteur));
		$retour = count($autorisations) > 0;
	}

	return $retour;
}

/**
 * Réponses à un formulaire éditable par un auteur
 *
 * Est-on en présence d'un auteur qui tente de modifier les réponses d'un formulaire
 * et que Formidable est configuré pour prendre en compte les auteurs
 * et que les auteurs sont en droit de modifier les réponses de leurs formulaires ?
 *
 * @param  array  $qui   Description de l'auteur demandant l'autorisation
 * @return bool  true s'il a le droit, false sinon
 *
*/
function formidable_auteur_admin_reponse($qui) {
	$retour = false;

	if (
		// Si c'est un admin complet
		(isset($qui['statut']) and $qui['statut'] == '0minirezo' and !$qui['restreint'])
		// Ou un admin restreint et qu'on a autorisé les restreints entiers à être admins des formulaires
		or ($qui['restreint'] and lire_config('formidable/autoriser_admin_restreint'))
		// Ou qu'on a autorisé les auteurs à être liés et donc admins de formulaires ET de leurs réponses
		or (lire_config('formidable/auteur') and lire_config('formidable/admin_reponses_auteur'))
	) {
		$retour = true;
	}

	return $retour;
}

/**
 * Fonction d'appel pour le pipeline
 * @pipeline autoriser
 */
function formidable_autoriser() {}

/**
 * Autorisation d'éditer un formulaire formidable
 *
 * Seuls les admins peuvent éditer les formulaires ou les auteurs explicitement associés à un formulaire
 *
 * @param  string $faire Action demandée
 * @param  string $type  Type d'objet sur lequel appliquer l'action
 * @param  int    $id    Identifiant de l'objet
 * @param  array  $qui   Description de l'auteur demandant l'autorisation
 * @param  array  $opt   Options de cette autorisation
 * @return bool          true s'il a le droit, false sinon
**/
function autoriser_formulaire_editer_dist($faire, $type, $id, $qui, $opt) {
	$ok = false;

	if (
		// Si on est admin complet
		(isset($qui['statut']) and $qui['statut'] == '0minirezo' and !$qui['restreint'])
		// Ou admin restreint avec l'option droit pour admin restreint
		or (isset($qui['statut']) and $qui['statut'] == '0minirezo' and $qui['restreint'] and lire_config('formidable/autoriser_admin_restreint'))
		// Ou si ya les auteurs liés et qu'on est bien lié à ce formulaire
		or (lire_config('formidable/auteur') and formidable_autoriser_par_auteur($id, $qui['id_auteur']))
	) {
		$ok = true;
	}

	return $ok;
}

/**
 * Autorisation de voir la liste des formulaires formidable
 *
 *  Admins et rédacteurs peuvent voir les formulaires existants
 *
 * @param  string $faire Action demandée
 * @param  string $type  Type d'objet sur lequel appliquer l'action
 * @param  int    $id    Identifiant de l'objet
 * @param  array  $qui   Description de l'auteur demandant l'autorisation
 * @param  array  $opt   Options de cette autorisation
 * @return bool          true s'il a le droit, false sinon
**/
function autoriser_formulaires_menu_dist($faire, $type, $id, $qui, $opt) {
	if (isset($qui['statut']) and ($qui['statut'] == '1comite' or $qui['statut'] == '0minirezo')) {
		return true;
	} else {
		return false;
	}
}


/**
 * Autorisation de répondre à un formulaire formidable
 *
 * On peut répondre à un formulaire si :
 * - c'est un formulaire classique
 * - on enregistre et que multiple = oui
 * - on enregistre et que multiple = non et que la personne n'a pas répondu encore
 * - on enregistre et que multiple = non et que modifiable = oui
 *
 * @param  string $faire Action demandée
 * @param  string $type  Type d'objet sur lequel appliquer l'action
 * @param  int    $id    Identifiant de l'objet
 * @param  array  $qui   Description de l'auteur demandant l'autorisation
 * @param  array  $opt   Options de cette autorisation
 * @return bool          true s'il a le droit, false sinon
**/
function autoriser_formulaire_repondre_dist($faire, $type, $id, $qui, $opt) {
	$id = intval($id);

	// On regarde si il y a déjà le formulaire dans les options
	if (isset($opt['formulaire'])) {
		$formulaire = $opt['formulaire'];
	} else {
		// Sinon on va le chercher
		$formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id);
	}

	$traitements = unserialize($formulaire['traitements']);

	// S'il n'y a pas d'enregistrement, c'est forcément bon
	if (!isset($traitements['enregistrement']) or !($options = $traitements['enregistrement'])) {
		return true;
	} else {
		// Sinon faut voir les options
		// Si multiple = oui c'est bon
		if ($options['multiple']) {
			return true;
		} else {
			// Si c'est modifiable, c'est bon
			if ($options['modifiable']) {
				return true;
			} else {
				include_spip('inc/formidable');
				// Si la personne n'a jamais répondu, c'est bon
				if (!formidable_verifier_reponse_formulaire($id, $traitements['enregistrement']['identification'], $traitements['enregistrement']['variable_php'], $traitements['enregistrement']['anonymiser'])) {
					return true;
				} else {
					return false;
				}
			}
		}
	}
}

/**
 * Autorisation d'associer un nouvel auteur à un formulaire
 *
 * mêmes autorisations que pour éditer le formulaire
 *
**/
function autoriser_formulaire_associerauteurs_dist($faire, $type, $id, $qui, $opt) {
	return autoriser_formulaire_editer_dist($faire, $type, $id, $qui, $opt);
}

/**
 * Autorisation de modifier un formulaire
 *
 * mêmes autorisations que pour éditer le formulaire
 *
**/
function autoriser_formulaire_modifier_dist($faire, $type, $id, $qui, $opt) {
	return autoriser_formulaire_editer_dist($faire, $type, $id, $qui, $opt);
}


/**
 * Autorisation d'instituer une réponse
 *
 * On peut modérer une réponse si on a le droit d'édition sur le formulaire parent,
 * et si on n'est pas admin, s'il y a l'option pour que les auteurs liés aient le droit de modérer les réponses aussi
 *
 * @param  string $faire Action demandée
 * @param  string $type  Type d'objet sur lequel appliquer l'action
 * @param  int    $id    Identifiant de l'objet
 * @param  array  $qui   Description de l'auteur demandant l'autorisation
 * @param  array  $opt   Options de cette autorisation
 * @return bool          true s'il a le droit, false sinon
**/
function autoriser_formulairesreponse_instituer_dist($faire, $type, $id, $qui, $opt) {
	$ok = false;

	// Quel formulaire parent
	if (isset($opt['id_formulaire'])) {
		$id_formulaire = intval($opt['id_formulaire']);
	}
	else {
		$id_formulaire = sql_getfetsel('id_formulaire', 'spip_formulaires_reponses', 'id_formulaires_reponse = '.intval($id));
	}

	if (
		// Si on a bien trouvé le formulaire parent
		$id_formulaire
		// Si on peut éditer le formulaire parent
		and autoriser('editer', 'formulaire', $id_formulaire, $qui, $opt)
		and (
			// Et soit on est admin
			(isset($qui['statut']) and $qui['statut'] == '0minirezo')
			or
			// Soit c'est autorisé pour les auteurs liés (et si on est là c'est forcément qu'on est auteur lié puisqu'autorisé à éditer)
			lire_config('formidable/admin_reponses_auteur')
		)
	) {
		$ok = true;
	}

	return $ok;
}

/**
 * Autorisation de voir les réponses d'un formulaire formidable
 *
 * Au moins rédacteur pour voir les résultats
 *
 * @param  string $faire Action demandée
 * @param  string $type  Type d'objet sur lequel appliquer l'action
 * @param  int    $id    Identifiant de l'objet
 * @param  array  $qui   Description de l'auteur demandant l'autorisation
 * @param  array  $opt   Options de cette autorisation
 * @return bool          true s'il a le droit, false sinon
**/
function autoriser_formulairesreponse_voir_dist($faire, $type, $id, $qui, $opt) {
	return autoriser_formulaire_editer_dist($faire, $type, $id, $qui, $opt);
}

/**
 * Autorisation de modifier une réponse d'un formulaire formidable
 *
 * Comme le droit d'instituer
 *
 * @param  string $faire Action demandée
 * @param  string $type  Type d'objet sur lequel appliquer l'action
 * @param  int    $id    Identifiant de l'objet
 * @param  array  $qui   Description de l'auteur demandant l'autorisation
 * @param  array  $opt   Options de cette autorisation
 * @return bool          true s'il a le droit, false sinon
**/
function autoriser_formulairesreponse_modifier_dist($faire, $type, $id, $qui, $opt) {
	return autoriser('instituer', $type, $id, $qui, $opt);
}

/**
 * Autorisation de supprimer une réponse d'un formulaire formidable
 *
 * Il faut pouvoir modifier les réponses d'un formulaire pour pouvoir les en supprimer
 *
 * @param  string $faire Action demandée
 * @param  string $type  Type d'objet sur lequel appliquer l'action
 * @param  int    $id    Identifiant de l'objet
 * @param  array  $qui   Description de l'auteur demandant l'autorisation
 * @param  array  $opt   Options de cette autorisation
 * @return bool          true s'il a le droit, false sinon
**/
function autoriser_formulairesreponse_supprimer_dist($faire, $type, $id, $qui, $opt) {
	$retour = autoriser_formulairesreponse_modifier_dist($faire, $type, $id, $qui, $opt);

	return $retour;
}

/**
 * Autorisation de poster une réponse en Collection+JSON
 *
 * Tout le monde peut, l'autorisation réelle se fera après pendant le traitement, suivant l'id_formulaire envoyé
 *
 * @param  string $faire Action demandée
 * @param  string $type  Type d'objet sur lequel appliquer l'action
 * @param  int    $id    Identifiant de l'objet
 * @param  array  $qui   Description de l'auteur demandant l'autorisation
 * @param  array  $opt   Options de cette autorisation
 * @return bool          true s'il a le droit, false sinon
**/
function autoriser_formulairesreponse_post_collection_dist($faire, $type, $id, $qui, $opt) {
	return true;
}