<?php
/*
 * Configuration Management
 */

namespace Sakura;

class Configuration {

    // Configuration data
    private static $_LCNF = [];
    private static $_DCNF = [];

    // Initialise configuration, does not contain database initialisation because explained below
    public static function init($local) {

        // Check if the configuration file exists
        if(!file_exists($local)) {

            trigger_error('Local configuration file does not exist', E_USER_ERROR);

        }

        // Attempt to load the configuration file
        $local = parse_ini_file($local, true);

        // Check if $local is an array and then store it in $_LCNF
        if(is_array($local)) {

            self::$_LCNF = $local;

        } else {

            // Otherwise trigger an error
            trigger_error('Failed to load local configuration file, check the structure of the file to see if you made mistake somewhere', E_USER_ERROR);

        }

    }

    /*
     * Initialise Database configuration values.
     * Different from init as that is called before the database connection is initially
     * established.
     */
    public static function initDB() {

        // Get config table from the database
        $_DATA = Database::fetch('config', true);

        // Create variable to temporarily store values in
        $_DBCN = array();

        // Properly sort the values
        foreach($_DATA as $_CONF) {

            $_DBCN[$_CONF['config_name']] = $_CONF['config_value'];

        }

        // Assign the temporary array to the static one
        self::$_DCNF = $_DBCN;

    }

    // Get values from the configuration on the file system
    public static function getLocalConfig($key, $subkey = null) {

        // Check if the key that we're looking for exists
        if(array_key_exists($key, self::$_LCNF)) {

            if($subkey) {

                // If we also have a subkey return the proper data
                return self::$_LCNF[$key][$subkey];

            } else {

                // else we just return the default value
                return self::$_LCNF[$key];

            }

        } else {// If it doesn't exist trigger an error to avoid explosions

            trigger_error('Unable to get local configuration value "'. $key .'"', E_USER_ERROR);

        }

    }

    // Dynamically set local configuration values, does not update the configuration file
    public static function setLocalConfig($key, $subkey, $value) {

        // Check if we also do a subkey
        if($subkey) {

            // If we do we make sure that the parent key is an array
            if(!isset(self::$_LCNF[$key])) {

                self::$_LCNF[$key] = array();

            }

            // And then assign the value
            self::$_LCNF[$key][$subkey] = $value;

        } else {

            // Otherwise we just straight up assign it
            self::$_LCNF[$key] = $value;

        }

    }

    // Get values from the configuration in the database
    public static function getConfig($key, $returnNull = false) {

        // Check if the key that we're looking for exists
        if(array_key_exists($key, self::$_DCNF)) {

            // Then return the value
            return self::$_DCNF[$key];

        } elseif($returnNull) {

            // Avoid the error trigger if requested
            return null;

        } else {

            // Then return the value
            trigger_error('Unable to get configuration value "'. $key .'"', E_USER_ERROR);

        }

    }

}