<?php

/**
 * Plugin CIBLOC
 * @copyright 2018 MTECT
 * @author Christophe IMBERTI (cf. CPI art L121-1)
 * @license GNU/GPLv3
 */

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

include_spip('inc/presentation');
include_spip('inc/actions');
include_spip('inc/autoriser');
include_spip('inc/documents');
include_spip('inc/filtres');
include_spip('inc/cibloc_verifier');

function cibloc_choiximporter($arg = '') {
	$res1 = '';
	$type_en_cours = '';

	$valeurs_config = ['icones_liste', 'icones_couleur', 'divers', 'couleur', 'palette', 'style'];

	$ret = cibloc_importer_config();

        $res1 = boite_ouvrir('', 'info');
	$res1 .= '<p><b>';
	if (isset($ret['erreurs'])) {
		$res1 .= _T('cibloc:traitement_echec') . '</b>';
		foreach ($ret['erreurs'] as $erreur) {
			$res1 .= '<br>' . $erreur;
		}
	} else {
		$res1 .= _T('cibloc:traitement_termine') . '</b>';
		if (isset($ret['imports'])) {
			foreach ($ret['imports'] as $type_et_id) {
				if ($type_et_id == 'couleur') {
					// eviter le doublon entre palette et couleur
				} elseif (in_array($type_et_id, $valeurs_config)) {
					$res1 .= '<br><br>' . _T('cibloc:choix_export_' . $type_et_id);
				} else {
					$pos = strpos($type_et_id, '_');
					$type = substr($type_et_id, 0, $pos);
					if (!$type_en_cours or $type_en_cours != $type) {
						$type_en_cours = $type;
						$res1 .= '<br><br>' . _T('cibloc:choix_export_' . $type_en_cours) . ' :<br>';
					}
					$res1 .= '  <i>' . $type_et_id . '</i>,';
				}
			}
		}
	}
	$res1 .= '</p>';
	$res1 .= boite_fermer();

	$res1 .= '<div style="text-align:right;"><a href="' . generer_url_ecrire(
		'configurer_cibloc'
	) . '">' . _T('icone_retour') . '</a></div><div>&nbsp;</div>';

	return $res1;
}

function cibloc_afficher_boite_upload() {
	$return = '';
	$texteon = _T('cibloc:televerser_config');
	$texteoff = _T('cibloc:config_a_importer');
	$document = false;
	$id_document = 0;
	$fichier = '';
	$date = '';
	$nom_cible = 'cibloc_config.txt';

	$id_document = intval(_request('show_docs'));
	if ($id_document) {
		$row = sql_fetsel('*', 'spip_documents', 'id_document=' . $id_document, '', '');
		if ($row) {
			$document = $row;
		}
	}

	if ($document) {
		$id_document = $document['id_document'];
		$date = $document['date'];
		$fichier = $document['fichier'];
		$extension = $document['extension'];

		if ($extension != 'txt') {
			// supprimer le fichier si l'extension n'est pas txt
			$row = sql_fetsel('*', 'spip_documents_liens', 'id_document=' . $id_document, '', '');
			if (!$row) {
				@unlink(_DIR_IMG . $fichier);
				sql_delete('spip_documents', 'id_document=' . $id_document);
			}
			$document = false;
			$return .= '<div class="formulaire_spip"><p class="reponse_formulaire reponse_formulaire_erreur">' . _T('cibloc:erreur_format_txt') . '</p></div>';

		} else {
			// imposer le nom et l'emplacement du fichier
			if ($fichier != $nom_cible) {
				$row = sql_fetsel('*', 'spip_documents_liens', 'id_document=' . $id_document, '', '');
				if (!$row) {
					$source = _DIR_IMG . $fichier;
					$destination = _DIR_IMG . $nom_cible;
					if (file_exists($destination)) {
						@unlink($destination);
					}
					@rename($source, $destination);
					sql_updateq('spip_documents', ['fichier' => $nom_cible], "id_document=$id_document");
					$document['fichier'] = $nom_cible;
					$fichier = $nom_cible;
				}
			}
		}
	}

	// l'utilisateur veut supprimer le fichier
	if ($id_supprdoc = intval(_request('supprimer_doc'))) {
		$row = sql_fetsel('*', 'spip_documents_liens', 'id_document=' . $id_supprdoc, '', '');
		if (!$row) {
			$row2 = sql_fetsel('*', 'spip_documents', 'id_document=' . $id_supprdoc, '', '');
			if ($row2) {
				$fichier_suppr = $row2['fichier'];
				if ($fichier_suppr == $nom_cible) {
					@unlink(_DIR_IMG . $fichier_suppr);
					sql_delete('spip_documents', 'id_document=' . $id_supprdoc);
					$document = false;
				}
			}
		}
	}

	if ($document) {
                $return .= boite_ouvrir($texteoff, 'important');

		$return .= "<div style='text-align: center;'>";
		$return .= quete_logo_document(
			$document,
			generer_objet_url($id_document, 'document', '', '', true),
			'',
			'',
			'',
			''
		);
		$return .= "</div>\n<div style='text-align: center;'>"
		. $fichier
		. "</div>\n";

		$fond = 'doc-24.gif';
		$texte = _T('icone_supprimer_document');
		$lien = generer_url_ecrire('cibloc_import_config', 'supprimer_doc=' . $id_document);
		$return .= icone_horizontale($texte, $lien, $fond, 'supprimer.gif', false);

		$res = '<br>';
		$res .= "<input type='hidden' name='show_docs' value=" . $id_document . ' >';
		$res .= "<input type='hidden' name='choiximporter' value='oui'>";

		$return .= generer_form_ecrire('cibloc_import_config', $res, '', attribut_html(_T('cibloc:bouton_import_config')));

                $return .= boite_fermer();
	}

	return $return;
}

function cibloc_importer_config() {
	$return = [];
	$document = false;
	$id_document = 0;
	$fichier = '';
	$date = '';
	$contenu = '';

	$id_document = intval(_request('show_docs'));
	if ($id_document) {
		$row = sql_fetsel('*', 'spip_documents', 'id_document=' . $id_document, '', '');
		if ($row) {
			$document = $row;
		}
	}

	if ($document) {
		$id_document = $document['id_document'];
		$date = $document['date'];
		$fichier = $document['fichier'];
	}

	if ($document) {
		$handle = fopen(_DIR_IMG . $fichier, 'r');
		if ($handle) {
			while (!feof($handle)) {
				$contenu .= fgets($handle, 4096);
			}
			fclose($handle);
		}

		// Suppression du fichier d'import
		sql_delete('spip_documents', 'id_document=' . $id_document);
		@unlink(_DIR_IMG . $fichier);

		// inserer en base de donnees
		$return = cibloc_importer($contenu);
	}

	return $return;
}

function cibloc_importer($contenu) {
	$return = [];
	$tableau = [];
	$imports = [];
	$erreurs = [];

	$champs_et_verification = [
		'type' => 'type',
		'id' => 'id',
		'nom' => 'nom',
		'statut' => 'statut',
		'preremplir' => 'preremplir',
		'couleur' => 'couleur',
		'bordure' => 'bordure',
		'couleur_bordure' => 'couleur_bordure',
		'alignement' => 'alignement',
		'couleur_bouton' => 'couleur_bouton',
		'couleur_bouton_survol' => 'couleur_bouton',
		'taille_texte' => 'taille_texte',
		'padding_top' => 'padding',
		'padding_bottom' => 'padding',
		'padding_right' => 'padding',
		'padding_left' => 'padding',
		'code_html_ouvrant' => 'code_html_ouvrant',
		'code_html_fermant' => 'code_html_fermant',
		'paragrapher' => 'paragrapher',
		'source' => 'source',
		'rang' => 'rang',
	];

	$valeurs_et_tables = [
		'bloc' => 'spip_cibloc_objets',
		'multi' => 'spip_cibloc_objets',
		'ensemble' => 'spip_cibloc_objets',
		'bouton' => 'spip_cibloc_objets',
		'icones_liste' => 'spip_cibloc_config',
		'icones_couleur' => 'spip_cibloc_config',
		'divers' => 'spip_cibloc_config',
		'couleur' => 'spip_cistyle_config',
		'palette' => 'spip_cistyle_config',
		'style' => 'spip_cistyle_config',
	];

	$valeurs_possibles = array_keys($valeurs_et_tables);

	if ($contenu) {
		$tableau_initial = explode(';', $contenu);
		if ($tableau_initial[0] == 'czo1OiJzdH|lsZSI7czo2OiJ2YWxldXIiO3M6NDQ0OiJhOjEx') {
			foreach ($tableau_initial as $valeur_et_contenu) {
				list($valeur, $contenu) = explode('|', $valeur_et_contenu);
				$tableau[$valeur] = $contenu;
			}

			foreach ($tableau as $valeur => $contenu) {
				if (in_array($valeur, $valeurs_possibles)) {
					$table = $valeurs_et_tables[$valeur];
					if ($table == 'spip_cibloc_objets') {
						$champ = 'type';
					} else {
						$champ = 'nom';
					}

					if ($contenu) {
						$rows = unserialize(base64_decode($contenu));

						if (is_array($rows) and $rows) {
							// verifier
							$ok = true;
							if ($table == 'spip_cibloc_objets') {
								foreach ($rows as $row) {
									$type_et_id = '';
									if (isset($row['type']) and isset($row['id'])) {
										if (cibloc_verifier_type($row['type']) and cibloc_verifier_id($row['id'])) {
											$type_et_id = $row['type'] . '_' . $row['id'];
											$imports[] = $type_et_id;
										}
									}
									foreach ($champs_et_verification as $champ_initial => $champ_verif) {
										if (isset($row[$champ_initial]) and $row[$champ_initial]) {
											if (!cibloc_verifier($champ_verif, $row[$champ_initial], $type_et_id, true)) {
												$ok = false;
												$erreurs[] = $type_et_id . ' (' . $champ_initial . ')';
											}
										}
									}
								}
							} else {
								$imports[] = $valeur;
								if (isset($row[0]['valeur']) and $row[0]['valeur']) {
									if (!cibloc_verifier_tableau($valeur, $rows[0]['valeur'], $type_et_id, true)) {
										$ok = false;
										$erreurs[] = $valeur;
									}
								}
							}

							if ($ok) {
								// supprimer existant
								sql_delete($table, $champ . "='" . $valeur . "'");

								// inserer
								foreach ($rows as $row) {
									sql_insertq($table, $row);
								}
							}
						}
					}
				}
			}
		} else {
			$erreurs[] = _T('cibloc:valeur_incorrecte');
		}
	}

	if ($erreurs) {
		$return['erreurs'] = $erreurs;
	} else {
		$return['imports'] = $imports;

		include_spip('inc/cibloc_commun');
		cibloc_purger_definition_cache();
		cibloc_purger_cache_js();
		cibloc_purger_cache_css();
		include_spip('inc/invalideur');
		suivre_invalideur('1');
	}

	return $return;
}
