<?php
/**
 * Php-Gtk MySQL administrator - Main application data storage
 * 
 * This is just an active wrapper around a plain INI file named the
 * same as the main program. INI information is made available as
 * a two-level array in the $properties member.
 * 
 * 
 * Configuration is loaded upon construction, and saved if changed 
 * upon destruction. Changes are detected by a hash.
 *
 * @license CeCILL 2.0
 * @copyright 2008 Ouest  Systemes Informatiques
 * @author Frederic G. MARAND
 * @version $Id: Pgma_Model.php,v 1.2 2008-05-25 20:31:40 cvs Exp $
 */

class Pgma_Model
  {
  /**
   * Program properties. This is an array of sections and value
   * from the <program>.ini file
   * Sections include:
   * - Layout
   *
   * @var array
   */
  public $properties;
  /**
   * Sign properties to detect any change
   *
   * @var string
   */
  protected $hash;

  /**
   * Obtain the file name of the configuration
   * file, without the directory
   *
   * Why static ? Because it is instance-independent
   * 
   * @return string
   */
  static protected function getConfigFileName()
    {
    /**
     * Why not just use basename ? Because in PHP-GTK
     * the PHP filename extension can be any .php*,
     */
    $name = $_SERVER['SCRIPT_NAME'];
    $name = pathinfo($name, PATHINFO_FILENAME);
    $name .= '.ini';
    return $name;  
    }
    
  /**
   * Auto-load configuration
   * 
   * @return void
   */
  function __construct()
    {
    $name = self::getConfigFileName();
    $this->properties = file_exists($name) ? parse_ini_file($name, TRUE) : NULL;
    $this->hash = md5(var_export($this->properties, TRUE));
    }
    
  /**
   * Auto-save configuration
   * 
   * @return void
   */
  function __destruct()
    {
    /**
     * No need to save if properties haven't been changed
     */
    if ($this->hash == md5(var_export($this->properties, TRUE)))
      {
      return;
      }
    else
      {
      echo "Saving application settings\n";
      }
      
    $name = self::getConfigFileName();
    $s = '';
    foreach ($this->properties as $sectionKey => $sectionValue)
      {
      $s .= "[$sectionKey]" . PHP_EOL;
      foreach ($sectionValue as $key => $value)
        {
        $s .= $key . ' = ';
        if (is_bool($value))
          {
          $s .= $value ? 'TRUE' : 'FALSE';
          }
        elseif (is_numeric($value))
          {
          $s .= $value;
          }
        elseif (is_string($value))
          {
          $s .= '"' . $value . '"';
          }
        else
          {
          die('Unsupported property type for '
            . "$sectionKey/$key: " . gettype($value)
            );
          }
        $s .= PHP_EOL;
        }
      }
    file_put_contents($name, $s);
    }
  }