<?php

class Session {
    
    private static 
$instance;
    private static 
$currentModule;
    private static 
$configFields;
    
    public static function 
getInstance() {
        if (!
self::$instance) {
            
self::$instance = new self;
            
self::$currentModule RootController::getModuleName();
            
self::$configFields = array('sortField''sortMode''filterText');
            if (
in_array(self::$currentModule, array('customers''invoice''quotation'))) {
                
self::$configFields[] = 'maintenanceDateRangeFrom';
                
self::$configFields[] = 'maintenanceDateRangeTo';
            }
            if (
in_array(self::$currentModule, array('invoices'))) {
                
self::$configFields[] = 'invoiceDateRangeFrom';
                
self::$configFields[] = 'invoiceDateRangeTo';
                
self::$configFields[] = 'showPaidInvoices';
            }
            
            if (!isset(
$_SESSION['listConfig'])) {
                
$_SESSION['listConfig'] = array();
            }
            
            
$listModule self::$currentModule;
            
            
# prepare
            
if (!isset($_SESSION['listConfig'][$listModule])) {
                
$_SESSION['listConfig'][$listModule] = array();
            }
            foreach (
self::$configFields as $field) {
                if (
$field == 'filterText') {
                    if ( ! (isset(
$_SESSION['listConfig'][$listModule]['filterText'])  &&  is_array($_SESSION['listConfig'][$listModule][$field]))) {
                        
$_SESSION['listConfig'][$listModule][$field] = array();
                    }
                } else {
                    
#if (!isset($_SESSION['listConfig'][$listModule][$field])) {
                    #    $_SESSION['listConfig'][$listModule][$field] = '';
                    #}
                
}
            }
            
            
# set from possible request data
            
if ( ! empty($listModule)) {
                foreach (
self::$configFields as $configField) {
                    if (isset(
$_REQUEST['listConfig_'.$listModule.'_'.$configField])) {
//                        if (isset($_REQUEST[])) {
//                            
//                        } else {
                            
$_SESSION['listConfig'][$listModule][$configField] = $_REQUEST['listConfig_'.$listModule.'_'.$configField];
//                        }
                    
}
                }
            } else {
                
$bt debug_backtrace(); $backtraceFlat '['.__CLASS__.'::'.__FUNCTION__.' / line '.__LINE__.' ] [caller: '.$bt[0]['file'].' / line '.$bt[0]['line'].']';
                
Errors::log('empty listModule. '.$backtraceFlat);
            }
        }
        return 
self::$instance;
    }
    
    public function 
getCurrentModule() {
        return 
self::$currentModule;
    }
    
    public function 
getListConfig($configField$defaultValue=null$listModule=null$subField=null) {
        if (!
$listModule) {
            
$listModule self::$currentModule;
        }
        
        
$returnValue false;
        
        if (empty(
$listModule)) {
            
$bt debug_backtrace(); $backtraceFlat '['.__CLASS__.'::'.__FUNCTION__.' / line '.__LINE__.' ] [caller: '.$bt[0]['file'].' / line '.$bt[0]['line'].']';
            
Errors::log('empty listModule. '.$backtraceFlat);
        }
        
        if (isset(
$_SESSION['listConfig'][$listModule])) {
            if (
in_array($configFieldself::$configFields)) {
                if (isset(
$_SESSION['listConfig'][$listModule][$configField])) {
                    if (
is_array($_SESSION['listConfig'][$listModule][$configField])) {
                        if (isset(
$_SESSION['listConfig'][$listModule][$configField][$subField])) {
                            
$returnValue $_SESSION['listConfig'][$listModule][$configField][$subField];
                        
#} else {
                        #    $bt = debug_backtrace(); $backtraceFlat = '['.__CLASS__.'::'.__FUNCTION__.' / line '.__LINE__.' ] [caller: '.$bt[0]['file'].' / line '.$bt[0]['line'].']';
                        #    Errors::log('unknown listConfig subField: '.$subField.' '.$backtraceFlat);
                        
}
                    } else {
                        
$returnValue $_SESSION['listConfig'][$listModule][$configField];
                    }
                } else {
                    
# use default value
                
}
            } else {
                
$bt debug_backtrace(); $backtraceFlat '['.__CLASS__.'::'.__FUNCTION__.' / line '.__LINE__.' ] [caller: '.$bt[0]['file'].' / line '.$bt[0]['line'].']';
                
Errors::log('unknown listConfig field: '.$configField.' '.$backtraceFlat);
            }
        } else {
            
$bt debug_backtrace(); $backtraceFlat '['.__CLASS__.'::'.__FUNCTION__.' / line '.__LINE__.' ] [caller: '.$bt[0]['file'].' / line '.$bt[0]['line'].']';
            
Errors::log('listConfig module \''.$listModule.'\' doesn\'t exist: '.$backtraceFlat);
        }
        
        if (
$returnValue === false) {
            if (
$defaultValue || $defaultValue === '' || $defaultValue === '0') {
                
$returnValue $defaultValue;
                if (isset(
$_SESSION['listConfig'][$listModule][$configField])  &&  is_array($_SESSION['listConfig'][$listModule][$configField])) {
                    
$_SESSION['listConfig'][$listModule][$configField][$subField] = $defaultValue;
                } else {
                    
$_SESSION['listConfig'][$listModule][$configField] = $defaultValue;
                }
            } else {
                
$bt debug_backtrace(); $backtraceFlat '['.__CLASS__.'::'.__FUNCTION__.' / line '.__LINE__.' ] [caller: '.$bt[0]['file'].' / line '.$bt[0]['line'].']';
                
Errors::log('can\'t use invalid listConfig default for configField: '.$configField.' '.$backtraceFlat);
            }
        }
        return 
$returnValue;
    }
    
    public function 
setListConfig($configField$value$listModule) {
        if (isset(
$_SESSION['listConfig'][$listModule])) {
            if (
in_array($configFieldself::$configFields)) {
                
$_SESSION['listConfig'][$listModule][$configField] = $value;
            } else {
                
$bt debug_backtrace(); $backtraceFlat '['.__CLASS__.'::'.__FUNCTION__.' / line '.__LINE__.' ] [caller: '.$bt[0]['file'].' / line '.$bt[0]['line'].']';
                
Errors::log('unknown listConfig field: '.$configField.' '.$backtraceFlat);
            }
        } else {
            
$bt debug_backtrace(); $backtraceFlat '['.__CLASS__.'::'.__FUNCTION__.' / line '.__LINE__.' ] [caller: '.$bt[0]['file'].' / line '.$bt[0]['line'].']';
            
Errors::log('unknown listConfig module: '.$listModule.' '.$backtraceFlat);
        }
    }
}