<?php

declare(strict_types=1);

namespace app\common\library;

/**
 * ISO 3166-1 alpha-2 国家代码与中文名称
 */
class CountryIso
{
    /**
     * 常用投放国家 ISO2 => 中文名
     *
     * @var array<string, string>
     */
    private const COUNTRIES = [
        'CN' => '中国',
        'HK' => '中国香港',
        'MO' => '中国澳门',
        'TW' => '中国台湾',
        'US' => '美国',
        'CA' => '加拿大',
        'GB' => '英国',
        'DE' => '德国',
        'FR' => '法国',
        'IT' => '意大利',
        'ES' => '西班牙',
        'NL' => '荷兰',
        'BE' => '比利时',
        'CH' => '瑞士',
        'AT' => '奥地利',
        'SE' => '瑞典',
        'NO' => '挪威',
        'DK' => '丹麦',
        'FI' => '芬兰',
        'IE' => '爱尔兰',
        'PT' => '葡萄牙',
        'PL' => '波兰',
        'CZ' => '捷克',
        'HU' => '匈牙利',
        'RO' => '罗马尼亚',
        'GR' => '希腊',
        'RU' => '俄罗斯',
        'UA' => '乌克兰',
        'TR' => '土耳其',
        'IL' => '以色列',
        'SA' => '沙特阿拉伯',
        'AE' => '阿联酋',
        'QA' => '卡塔尔',
        'KW' => '科威特',
        'IN' => '印度',
        'PK' => '巴基斯坦',
        'BD' => '孟加拉国',
        'TH' => '泰国',
        'VN' => '越南',
        'MY' => '马来西亚',
        'SG' => '新加坡',
        'ID' => '印度尼西亚',
        'PH' => '菲律宾',
        'JP' => '日本',
        'KR' => '韩国',
        'AU' => '澳大利亚',
        'NZ' => '新西兰',
        'BR' => '巴西',
        'MX' => '墨西哥',
        'AR' => '阿根廷',
        'CL' => '智利',
        'CO' => '哥伦比亚',
        'PE' => '秘鲁',
        'ZA' => '南非',
        'EG' => '埃及',
        'NG' => '尼日利亚',
        'KE' => '肯尼亚',
    ];

    /**
     * 下拉选项 ISO2 => 中文名
     *
     * @return array<string, string>
     */
    public static function getOptions(): array
    {
        return self::COUNTRIES;
    }

    /**
     * 校验是否为合法 ISO2 代码
     */
    public static function isValidCode(string $code): bool
    {
        $code = strtoupper(trim($code));
        return isset(self::COUNTRIES[$code]);
    }

    /**
     * 规范化并过滤国家代码列表
     *
     * @param array<int, string>|string $codes
     * @return array<int, string>
     */
    public static function normalizeCodes($codes): array
    {
        if (is_string($codes)) {
            $codes = explode(',', $codes);
        }
        if (!is_array($codes)) {
            return [];
        }
        $result = [];
        foreach ($codes as $code) {
            $code = strtoupper(trim((string)$code));
            if ($code !== '' && self::isValidCode($code) && !in_array($code, $result, true)) {
                $result[] = $code;
            }
        }
        sort($result);
        return $result;
    }

    /**
     * 逗号分隔 ISO 代码转中文展示
     */
    public static function codesToText(string $codes): string
    {
        if ($codes === '') {
            return '';
        }
        $parts = [];
        foreach (explode(',', $codes) as $code) {
            $code = strtoupper(trim($code));
            if ($code === '') {
                continue;
            }
            $parts[] = self::COUNTRIES[$code] ?? $code;
        }
        return implode(',', $parts);
    }

    /**
     * 数组转存储字符串
     *
     * @param array<int, string> $codes
     */
    public static function codesToStorage(array $codes): string
    {
        return implode(',', self::normalizeCodes($codes));
    }
}
