<?php
/**
 * SHOW_SITE_COUNTRY 允许列表解析与比对
 */
require_once __DIR__ . '/CountryCodeNormalizer.php';

class CountryAllowlist
{
    /**
     * SHOW_SITE_COUNTRY 是否已配置（非空允许列表 = 开启国家条件）
     *
     * @param string|null $config 默认读取 SHOW_SITE_COUNTRY
     */
    public static function isEnabled($config = null)
    {
        if ($config === null) {
            $config = defined('SHOW_SITE_COUNTRY') ? SHOW_SITE_COUNTRY : '';
        }
        return self::parse($config) !== [];
    }

    /**
     * 保存前规范化用户输入：兼容中文逗号/分号、顿号、全角空格及多余空白。
     *
     * @param string $config
     */
    public static function normalizeInput($config)
    {
        $config = trim((string) $config);
        if ($config === '') {
            return '';
        }

        // 全角空格、不间断空格
        $config = preg_replace('/[\x{3000}\x{00A0}]/u', ' ', $config);

        // 常见误输入分隔符统一为英文逗号
        $config = str_replace(['，', ';', '；', '、'], ',', $config);

        // 去掉分隔符两侧空白，合并连续逗号
        $config = preg_replace('/\s*,\s*/', ',', $config);
        $config = preg_replace('/,+/', ',', $config);

        return trim($config, " \t\n\r,");
    }

    /**
     * @param string $config 逗号分隔国家码，如 US,GB,CA
     * @return string[]
     */
    public static function parse($config)
    {
        $config = self::normalizeInput($config);
        if ($config === '') {
            return [];
        }

        $parts = explode(',', $config);
        $out   = [];
        foreach ($parts as $part) {
            $part = trim($part);
            if ($part === '') {
                continue;
            }
            $normalized = CountryCodeNormalizer::toAlpha2($part);
            if ($normalized !== null && $normalized !== '') {
                $out[] = $normalized;
            }
        }
        return array_values(array_unique($out));
    }

    /**
     * 读取并规范化 SHOW_SITE_COUNTRY（大写 ISO2，逗号分隔）
     *
     * @param string|null $config 默认 SHOW_SITE_COUNTRY
     */
    public static function resolvedConfig($config = null)
    {
        if ($config === null) {
            $config = defined('SHOW_SITE_COUNTRY') ? SHOW_SITE_COUNTRY : '';
        }
        return self::formatForConfig($config);
    }

    /**
     * 保存配置前规范化国家列表字符串（dashboard 写入用，输出大写如 US,GB）
     *
     * @param string $config
     * @return string 如 US,GB
     */
    public static function formatForConfig($config)
    {
        $list = self::parse($config);
        return implode(',', $list);
    }

    /**
     * @param string|null $countryCode
     * @param string[]    $allowlist
     */
    public static function isAllowed($countryCode, array $allowlist)
    {
        if ($allowlist === []) {
            return true;
        }
        $normalized = CountryCodeNormalizer::toAlpha2($countryCode);
        if ($normalized === null || $normalized === '') {
            return false;
        }
        return in_array($normalized, $allowlist, true);
    }
}
