<?php

/**
 * Action retournant un morceau du plan du site (en ajax)
 *
 * @plugin     Plan du site dans l’espace privé
 * @copyright  2015
 * @author     Matthieu Marcillaud
 * @licence    GNU/GPL
 * @package    SPIP\Plan\Action
 */

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

function action_deplacer_objets_dist() {

	include_spip('inc/autoriser');
	if (!autoriser('ecrire')) {
		return plan_json_erreur(_T('plan:erreur_autorisation_insuffisante') . ' ' . _T('plan:erreur_deplacement_impossible'));
	}

	include_spip('base/objets');

	$objet = objet_type(_request('objet'));
	$table = table_objet_sql($objet);
	$_id_table = id_table_objet($table);

	$ids = _request('id_objet');
	$id_rubrique_old = _request('id_rubrique_source');
	$id_rubrique_new = _request('id_rubrique_destination');

	if (!is_array($ids) or !$objet) {
		return plan_json_erreur(_T('plan:erreur_aucun_identifiant') . ' ' . _T('plan:erreur_deplacement_impossible'));
	}
	if ($id_rubrique_old == $id_rubrique_new) {
		return plan_json_erreur(_T('plan:erreur_rubriques_parentes_incorrectes') . ' ' . _T('plan:erreur_deplacement_impossible'));
	}
	if ($objet != 'rubrique' and !$id_rubrique_new) {
		return plan_json_erreur(_T('plan:erreur_rubriques_parentes_incorrectes') . ' ' . _T('plan:erreur_deplacement_impossible'));
	}

	$ids = array_filter($ids);

	if ($objet == 'rubrique') {
		$champ = 'id_parent';
	} else {
		$champ = 'id_rubrique';
	}

	// ne modifier que si les emplacements n'ont pas déjà changé !
	$ids = sql_allfetsel($_id_table, $table, [sql_in($_id_table, $ids), $champ . '=' . sql_quote($id_rubrique_old)]);
	$ids = array_column($ids, $_id_table);

	include_spip('action/editer_objet');

	$errors = $success = [];
	$modifs = ['id_parent' => $id_rubrique_new];

	foreach ($ids as $id) {
		if (autoriser('modifier', $objet, $id)) {
			if ($err = objet_modifier($objet, $id, $modifs)) {
				$errors["$objet-$id"] = $err;
			} else {
				$success["$objet-$id"] = true;
			}
		} else {
			$errors["$objet-$id"] = _T('plan:erreur_autorisation_insuffisante') . ' ' . _T('plan:erreur_deplacement_impossible');
		}
	}

	// dans certains cas… on ne reçoit pas d'erreur… et pourtant !
	if (!$errors) {
		// on verifie qu'il n'y a plus d'objets à l'ancien emplacement
		$ids = sql_allfetsel(
			$_id_table,
			$table,
			[sql_in($_id_table, $ids), $champ . '=' . sql_quote($id_rubrique_old)]
		);
		$ids = array_column($ids, $_id_table);
		if ($ids) {
			foreach ($ids as $id) {
				$errors["$objet-$id"] = _T('plan:erreur_deplacement');
				unset($success["$objet-$id"]);
			}
		}
	}

	return plan_json_envoi([
		'done' => true,
		'success' => $success,
		'errors' => $errors,
	]);
}

function plan_json_envoi($data) {
	header('Content-Type: application/json; charset=' . $GLOBALS['meta']['charset']);
	echo json_encode($data, JSON_THROW_ON_ERROR);
}

function plan_json_erreur($msg) {
	return plan_json_envoi([
		'done' => false,
		'success' => [],
		'errors' => [$msg],
	]);
}
