package com.seayoo.sdk.httpdns;

import com.seayoo.sdk.httpdns.HttpDns;
import com.seayoo.sdk.httpdns.HttpDnsResult;

import java.util.List;

/**
 * Unity C# 与 Combo native HTTPDNS 模块之间的薄桥接。
 * C# 经 AndroidJavaClass 调用 resolve() —— 单次 JNI 调用，返回简单字符串。
 *
 * 腾讯 HTTPDNS SDK 的接入、初始化与配置由 native 层（combo 模块 HttpDns，
 * 在 Combo.onApplicationCreate 阶段、Unity 启动前完成）。本桥仅转调 HttpDns。
 * 设计对齐 iOS 桥 HttpDnsBridge.mm（调用 native [[HttpDns shared] resolve:]）。
 *
 * 返回格式："ip4a,ip4b|ip6a,ip6b"
 *   - '|' 分隔 IPv4 / IPv6 两个地址族
 *   - ',' 分隔同族内多个 IP
 *   - 某侧为空串 = 该族无结果；整体返回 null = 不可用（C# 退化系统 DNS）
 */
public class HttpDnsBridge {

    /** 解析域名，返回 "ipv4|ipv6"；失败/不可用返回 null。 */
    public static String resolve(String domain) {
        if (domain == null || domain.isEmpty()) {
            return null;
        }
        // Throwable，而非 Exception：若 combo/腾讯 SDK 在运行期缺失，首次引用会抛
        // NoClassDefFoundError —— 必须退化为「无结果」（C# 回退系统 DNS），不可崩溃游戏。
        try {
            HttpDnsResult result = HttpDns.INSTANCE.resolve(domain);
            if (result == null) {
                return null;
            }
            String v4Part = join(result.getIpv4());
            String v6Part = join(result.getIpv6());
            if (v4Part.isEmpty() && v6Part.isEmpty()) {
                return null;
            }
            return v4Part + "|" + v6Part;
        } catch (Throwable t) {
            return null;
        }
    }

    /** HTTPDNS 是否可用（凭据齐全 + 初始化成功）。 */
    public static boolean isAvailable() {
        try {
            return HttpDns.INSTANCE.isAvailable();
        } catch (Throwable t) {
            return false;
        }
    }

    private static String join(List<String> ips) {
        if (ips == null || ips.isEmpty()) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (String ip : ips) {
            if (ip == null || ip.isEmpty()) {
                continue;
            }
            if (sb.length() > 0) {
                sb.append(",");
            }
            sb.append(ip);
        }
        return sb.toString();
    }
}
