self::getRequirementsList(),
        ];
        return view('config.requirements', $args);
    }
    public static function getRequirementsList($file = null)
    {
        $requirements = self::getRequirements($file);
        $list = [
            tr('Apache') => $requirements['apache'],
            tr('PHP (_VERSION_)', [
                '_VERSION_' => phpversion(),
            ]) => $requirements['php'],
            tr('Percorsi di servizio') => $requirements['paths'],
        ];
        return $list;
    }
    public static function getRequirements($file = null)
    {
        if (empty($file) && isset(self::$requirements)) {
            return self::$requirements;
        }
        $list = config('requirements');
        if (!empty($file)) {
            $file = realpath($file);
            if (Str::startsWith($file)) {
                $list = include $file;
            }
        }
        // Apache
        if (function_exists('apache_get_modules')) {
            $available_modules = apache_get_modules();
        }
        $apache = $list['apache'];
        foreach ($apache as $name => $values) {
            $status = isset($available_modules) ? in_array($name, $available_modules) : false;
            $status = isset($values['server']) && isset($_SERVER[$values['server']]) ? $_SERVER[$values['server']] == 'On' : $status;
            $apache[$name]['description'] = tr('Il modulo Apache _MODULE_ deve essere abilitato', [
                '_MODULE_' => ''.$name.'',
            ]);
            $apache[$name]['status'] = $status;
        }
        // PHP
        $php = $list['php'];
        foreach ($php as $name => $values) {
            if ($values['type'] == 'ext') {
                $description = !empty($values['required']) ? tr("L'estensione PHP _EXT_ deve essere abilitata", [
                    '_EXT_' => ''.$name.'',
                ]) : tr("E' consigliata l'abilitazione dell'estensione PHP _EXT_", [
                    '_EXT_' => ''.$name.'',
                ]);
                $status = extension_loaded($name);
            } else {
                $suggested = str_replace(['>', '<'], '', $values['suggested']);
                $value = ini_get($name);
                $description = tr("Valore consigliato per l'impostazione PHP: _VALUE_ (Valore attuale: _INI_)", [
                    '_VALUE_' => $suggested,
                    '_INI_' => ini_get($name),
                ]);
                $suggested = strpos($suggested, 'B') !== false ? $suggested : $suggested.'B';
                $value = strpos($value, 'B') !== false ? $value : $value.'B';
                $ini = FileSystem::convertBytes($value);
                $real = FileSystem::convertBytes($suggested);
                if (Str::startsWith($values['suggested'], '>')) {
                    $status = $ini >= substr($real, 1);
                } elseif (Str::startsWith($values['suggested'], '<')) {
                    $status = $ini <= substr($real, 1);
                } else {
                    $status = ($real == $ini);
                }
                $php[$name]['value'] = $value;
                if (is_bool($suggested)) {
                    $suggested = !empty($suggested) ? 'On' : 'Off';
                }
            }
            $php[$name]['description'] = $description;
            $php[$name]['status'] = $status;
        }
        // Percorsi di servizio
        $paths = [];
        foreach ($list['directories'] as $name) {
            $status = is_writable(base_path().DIRECTORY_SEPARATOR.$name);
            $description = tr('Il percorso _PATH_ deve risultare accessibile da parte del gestionale (permessi di lettura e scrittura)', [
                '_PATH_' => ''.$name.'',
            ]);
            $paths[$name]['description'] = $description;
            $paths[$name]['status'] = $status;
        }
        $result = [
            'apache' => $apache,
            'php' => $php,
            'paths' => $paths,
        ];
        if (empty($file)) {
            self::$requirements = $result;
        }
        return $result;
    }
    public static function isSatisfied()
    {
        $general_status = true;
        $requirements = self::getRequirements();
        foreach ($requirements as $key => $values) {
            foreach ($values as $value) {
                $general_status &= !empty($value['required']) ? $value['status'] : true;
            }
        }
        return $general_status;
    }
}