<?php

declare(strict_types=1);

/**
 * 共享主機 open_basedir 下安全檢查路徑（避免對不允許目錄呼叫 is_file/is_dir 觸發 Warning）。
 */

if (!function_exists('fate_path_is_within_open_basedir')) {
    function fate_path_is_within_open_basedir(string $path): bool
    {
        $openBasedir = ini_get('open_basedir');
        if (!is_string($openBasedir) || trim($openBasedir) === '') {
            return true;
        }
        $pathNorm = str_replace('\\', '/', $path);
        foreach (preg_split('/[:;]/', $openBasedir) ?: [] as $root) {
            $root = rtrim(str_replace('\\', '/', trim($root)), '/');
            if ($root === '' || $root === '.') {
                continue;
            }
            if ($pathNorm === $root || str_starts_with($pathNorm, $root . '/')) {
                return true;
            }
        }

        return false;
    }
}

if (!function_exists('fate_path_is_file_safe')) {
    function fate_path_is_file_safe(string $path): bool
    {
        if ($path === '' || !fate_path_is_within_open_basedir($path)) {
            return false;
        }

        return is_file($path);
    }
}

if (!function_exists('fate_path_is_dir_safe')) {
    function fate_path_is_dir_safe(string $path): bool
    {
        if ($path === '' || !fate_path_is_within_open_basedir($path)) {
            return false;
        }

        return is_dir($path);
    }
}

if (!function_exists('fate_path_safe_is_file')) {
    /**
     * @return bool|null true/false 可判定；null 表示路徑不在 open_basedir 內
     */
    function fate_path_safe_is_file(string $path): ?bool
    {
        if ($path === '') {
            return false;
        }
        if (!fate_path_is_within_open_basedir($path)) {
            return null;
        }

        return is_file($path);
    }
}
