<?php

/*******************************************************************************\
 * BIODIV, plugin et squelette pour SPIP - https://www.spip.net/               *
 *         dédié à la gestion d'observations naturalistes                      *
 *                                                                             *
 *         Copyright (C) 2008-2020 Renaud LAURETTE                             *
 *                                                                             *
 * BIODIV a été développé initialement pour le projet Biodiv.Balma de l'APCVEB *
 * (Association de Protection du Cadre de Vie et de l'Environnement balmanais) * 
 *     voir Biodiv.Balma : https://balma.biodiv.fr/                            *
 *     voir APCVEB : http://apcveb.free.fr/                                    *
 *                                                                             *
 *  Ce programme est un logiciel libre distribué sous licence GNU/GPL.         *
 *  Pour plus de détails voir les fichier COPYING.txt et LICENCE-BIODIV.md     *
\*******************************************************************************/

/*
 * Recoit un tableau data dont les index sont des années précédées d'un
 * x minuscule (eg. "x2007") et dont les valeurs sont des entiers positifs
 * (des comptages). Le script revoie un SVG dont la largeur fait 100% et
 * qui s'adapte en hauteur.
 * Parametres : 
 *		ENV{data} : le tableau
 *		ENV{titre} : le titre du graphique
 *		ENV{couleur} : la couleur de remplissage des barres
 */
    $i=0; $data = array(
     <BOUCLE_db(POUR) {tableau #ENV{data}} {","}> 
       "#CLE" => #VALEUR
     </BOUCLE_db>
     );
     
    if(count($data) == 0) {
        echo "<svg width='100%' height='auto' viewBox='-10 0 140 20'>\n"; 
        echo " <text x='50' y='60' transform='scale(0.2 0.2)' fill='black'>[(#ENV{titre}) - ]Aucune donnée.</text>\n";
        echo "</svg>\n";
    } else {
    
    $amin = $amax = $vmin = $vmax = $count =0;
    
    // Mise à jour des min/max
    foreach($data as $key => $value) {
      // Extraction de l'année
      preg_match('/x(\d{4})/',$key,$matches);
      $annee = $matches[1]; 
      $count += $value;
      if($i==0) {
      	$amin = $annee; $amax = $annee;
      	$vmin = $value; $vmax=$value;
      	$i=1;
      } else {
      	$amin = ($annee < $amin)?$annee:$amin;
      	$amax = ($annee > $amax)?$annee:$amax;
      	$vmin = ($value < $vmin)?$value:$vmin;
      	$vmax = ($value > $vmax)?$value:$vmax;
      }
    }
     
    if($amin != $amax) {
    	// Dimensionnement des axes
    	$da = $amax - $amin +1;
     
    	$dv = $vmax - $vmin;
    	if($dv > 0) {
    		$vb = floor(log10($dv));
    		$ygrad = pow(10,$vb);
    	} else {
    		$ygrad = 1;
    		$dv=1;
    	}

    	$yvmin = floor($vmin /$ygrad) * $ygrad;
    	$cy = 0;
    	if(($yvmin == $vmin) && ($vmin !=0)) {
    	  $yvmin = $yvmin - $ygrad;
    	  $cy = 1;
    	  }
    	$dyv = ceil($dv /$ygrad)+1+$cy;
    	$yvmax = $yvmin + $dyv*$ygrad;
      
    	$dx = $da*10; $x2=$dx+5;
    	$height = $dyv*10;
    	$xview = $dx + 20; 
    	$xview = ($xview < 140)?140:$xview;
    	$yview = $height + 20;

    	echo "<svg width='100%' height='auto' viewBox='-10 0 $xview $yview'>\n";
    	echo " <g style='stroke:black; stroke-width:0.5;'>\n";
    	echo "   <line x1='5' y1='$height' x2='5' y2='0' />\n";
    	echo "   <line x1='5' y1='$height' x2='$x2' y2='$height' />\n";
    	echo " </g>\n";
    	echo " <g transform='scale(1 -1) translate(5 -$height)' style='stroke:black; fill:white; stroke-width:0.5;'>\n";

     
    	// Tracé des données
    	foreach($data as $key => $value) {
         	preg_match('/x(\d{4})/',$key,$matches);
         	$annee = $matches[1];
         	$px = ($annee - $amin)* 10;
         	$h = 10*($value - $yvmin)/$ygrad;
         	echo "   <rect x='$px' y='0' width='10' height='$h' fill='#ENV{couleur,#93CA88}'/>\n";
         	}
         
         // Affichage des graduations en ordonnées
         for($i=0; $i <$dyv ;$i++) {
         	$py = $i*50; $yval = $yvmin+ $i*$ygrad;
         	echo "   <text x='-50' y='-$py' transform='scale(0.2 -0.2)' fill='black'>$yval</text>\n";
         	}

         // Affichage des années en abscisse     
         for($j=0; $j<$da; $j++) {
        	 $tx = $j*50 + 7;
        	 $annee = $amin + $j;
        	 echo "<text x='$tx' y='25' transform='scale(0.2 -0.2)' fill='black'>". $annee ."</text>\n";
        	 }

        	 echo " </g>";
        	 $yt = ($height + 12)*5;
        	 echo " <text x='50' y='$yt' transform='scale(0.2 0.2)' fill='black'>[(#ENV{titre}) - ]Total $count</text>\n";
        	 echo "</svg>\n"; 
       } else {
       		echo "<svg width='100%' height='auto' viewBox='-10 0 140 20'>\n"; 
       		echo " <text x='50' y='60' transform='scale(0.2 0.2)' fill='black'>[(#ENV{titre}) - ]Total en $amin: $count</text>\n";
       		echo "</svg>\n";
       }
    }
?>