<?php

/**
 * Класс-обертка для конфигурационного файла с настройками сайта
 * В отличие от класса Settings, Config оперирует низкоуровневыми настройками, например найстройками базы данных.
 */

final class Config
{
    private $config_file = 'config.ini';
    private $vars = array();

    // В конструкторе записываем настройки файла в переменные этого класса
    // для удобного доступа к ним. Например: $buyers->config->db_user
    public function __construct()
    {
        $cwd = dirname(__DIR__);

        // Читаем настройки из дефолтного файла и записываем настройку как переменную класса
        $this->vars = parse_ini_file($cwd.'/'.$this->config_file, false, INI_SCANNER_TYPED);

        // Протокол
        $this->vars['protocol'] = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http';
        $this->vars['host'] = $_SERVER['HTTP_HOST'];

        $tmp = explode('.', $_SERVER["HTTP_HOST"]);
        if($this->vars['subdomain'] = count($tmp) < 3 ? '' : $tmp[0])
        {
            array_shift($tmp);
            $this->vars['host'] = implode('.', $tmp);
        }

        $this->vars['root_url'] = $this->vars['protocol'].'://'.$_SERVER['HTTP_HOST'];

        // Определяем корневую директорию сайта
        $this->vars['root_dir'] =  $cwd.'/';
    }

    // Магическим методом возвращаем нужную переменную
    public function __get($name)
    {
        if(isset($this->vars[$name]))
            return $this->vars[$name];
        else
            return null;
    }

    // Магическим методом задаём нужную переменную.
    // Нужно только при установке системы через отдельный скрипт, в котором будет формироваться config.ini
    public function __set($name, $value)
    {
        if(isset($this->vars[$name]))
        {
            $conf = file_get_contents($this->vars['root_dir'].$this->config_file);
            $conf = preg_replace("/".$name."\s*=.*\n/i", $name.' = '.$value.";\r\n", $conf);
            file_put_contents($this->vars['root_dir'].$this->config_file, $conf);
            $this->vars[$name] = $value;
        }
    }
}
